我在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作为子类,我应该在该类的release或dealloc方法中做一些特定的事情,而不是直接调用它的[super]方法吗?
发布于 2011-02-24 01:53:24
不要调用retainCount
正如您已经发现的,在处理复杂的框架时,retainCount是无用的。有许多内部实现细节可能会导致保留计数在任何给定时间为意外值,而不会指示错误。
您应该释放场景以平衡您保留场景的次数,不多也不少。
如果你释放它的次数比你保留它的次数多,你的应用程序很可能会在你可能不小心修复真正的问题时崩溃。
通常,在处理视图、层或精灵等项的层次结构时,您会删除根视图/层/精灵,该删除会负责拆卸层次结构(包括根据需要释放)。
这假设您在层次结构中没有保留任何内容。如果您有,那么您还需要在删除和释放根时释放这些引用。
发布于 2011-02-23 21:11:47
通常你不需要自己释放你的孩子。你怎么添加你的孩子?
https://stackoverflow.com/questions/5087939
复制相似问题