【问题标题】:Cocos2D Scene DeallocationCocos2D 场景释放
【发布时间】:2012-06-06 22:40:11
【问题描述】:

究竟何时调用Cocos2D 场景的dealloc 方法? 就在加载另一个场景时?还是在场景加载完成后?
另外,如果我打算覆盖它,dealloc 方法中必须包含什么?
显然,cocos2D 会在场景被解除分配时自动删除附加到场景的所有节点。但是,如果我打算覆盖它,具体我必须调用哪些方法? 那么如何管理我的场景以确保它们 100% 无泄漏? 提前致谢!

【问题讨论】:

    标签: iphone objective-c ios cocos2d-iphone


    【解决方案1】:

    CCScene 的释放器遵循与任何其他对象相同的规则。当对 CCScene 的引用计数达到零时,它将运行。

    默认情况下,一个场景不关心另一个即将替换它的场景,但是如果您使用过渡来更改场景,则会有一段时间同时存在两个场景。当过渡结束时,过渡将释放它对第一个场景的引用,这可能是最后一个这样的引用,然后第一个场景将被释放。

    在您的场景释放器中,放置一个 CCLOG 以准确查看它何时运行。我每个都放一个以确保。

    一般情况下,手动释放您使用以allocnewcopy 开头的方法创建的任何对象,无论它是否是 Cocos2D 对象。其他创建方法,例如 Cocos2D 的node,不需要手动释放,除非您自己也选择了手动retain 对象,如果您不打算将其作为子对象添加到另一个对象,这可能是可取的立即结点。

    正如您所说,将一个节点作为子节点添加到另一个节点并不意味着它需要额外的release; Cocos2D 会处理那个。

    【讨论】:

    • 哦...我想我现在明白了!不过现在,我有一个场景,它拥有一个 cocos2D 节点的对象。每次我“刷新”它时,我都会使用 init。这是否意味着我正在泄漏内存? (我只在dealloc方法中释放一次。再次感谢!
    • 抱歉,你是对的,是alloc导致了retain count被实现,而不是init——但它们通常一起使用。这取决于您在 init 中执行的操作 - 通常在 init 中会创建其他对象,因此如果您在再次调用 init 之前没有释放这些对象,您可能会遇到问题。
    【解决方案2】:

    您在场景类中分配的每个未作为子对象添加到场景中的对象都必须显式释放。

    当您用另一个场景对象替换它(使用replaceScene 方法)或从场景堆栈中弹出它时,会释放一个场景(如果您没有在其他地方保留它,大多数情况下会释放它)。

    始终建议您查看源代码(其中包含非常有用的 cmets)并了解如果您自定义场景类应该做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多