【问题标题】:Scenes not completly released in Cocos2d iPhone application - debuggingCocos2d iPhone 应用程序中未完全发布的场景 - 调试
【发布时间】:2011-02-23 07:06:35
【问题描述】:

我在 Cocos2d 中有一个 iPhone 应用程序,由于内存问题,它有时会在实际设备上崩溃。

到目前为止,我发现这些场景在切换时并没有完全释放 - 他们的 [retainCount] 大约是 4-10 :)

dealloc 方法永远不会被调用,然后我假设,当我切换场景几次时,就会出现内存问题。

我想知道 - 我应该在哪里释放场景?由于它有很多孩子,我想我应该对它们进行清理。但事实证明,从层中删除所有子层并不会减少它的保留计数。我在我的cleanup 方法中添加了这样一段代码:

- (void) cleanup {
    while ([self.children count] > 0) {
        CCLOG(@"child: %d - %@  rc: %d", 0, [self.children objectAtIndex:0], [[self.children objectAtIndex:0] retainCount]);
        [self removeChild:[self.children objectAtIndex:0] cleanup:YES];
    }
    [super cleanup];
}

但是[self retainCount] 方法仍然返回一个大于 1 或 0 的数字,并且我的 dealloc 没有被调用。

为了正确释放这些孩子,我应该做些什么吗?如果我将自己的 CCSprite 子类添加为子类,我是否应该在该类中做一些特定的事情 releasedealloc 方法,然后只是调用它的 [super] 方法?

【问题讨论】:

    标签: iphone cocoa-touch memory-management cocos2d-iphone


    【解决方案1】:

    不要调用retainCount

    retainCount 在处理复杂框架时毫无用处,正如您所发现的。任何数量的内部实现细节都可能导致保留计数在任何给定时间成为意外值,而不会指示错误。

    无论你保留多少次,都应该释放场景以保持平衡,不多也不少。

    如果您发布它的次数多于保留它的次数,那么每当您 [可能不小心] 修复真正的问题时,您的应用都可能崩溃。

    一般来说,当处理视图、图层或精灵等项目的层次结构时,您会删除根视图/图层/精灵,并且该删除负责拆除层次结构(包括释放如所须)。

    假设您没有在层次结构中保留任何内容。如果有,那么您还需要在移除和释放根目录时释放这些引用。

    【讨论】:

      【解决方案2】:

      通常你不必自己释放你的孩子。您如何添加您的孩子?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多