我很确定我以某种方式犯了一个愚蠢的错误,但我似乎无法修复它。我得到了一个 CCScene 的子类,它又拥有一个 cclayer 的子类作为层,大致如下:
@interface MyLayer : CCLayer {
}
// some methods
@end
@interface MyScene : CCScene {
MyLayer *_myLayer;
}
// some methods
@end
在构建时,我执行以下操作:
-(id) init {
if (self = [super init]) {
_myLayer = [MyLayer node];
[self addChild:_myLayer];
// more stuff
}
}
我需要 _myLayer 中的引用,因为我需要与图层交互。但是,这使我的保留计数为 2(一次在 _myLayer 中,一次作为场景的子节点)。到目前为止没问题 - 至少据我了解。然而,这也意味着,我必须释放它。所以,MyScene 的 dealloc 看起来像这样:
-(void) dealloc {
[_myLayer release];
_myLayer = nil;
[super dealloc];
}
如果我现在在运行时释放场景,一切正常。我遵循了发布的过程,一切都很好,我可以毫无问题地发布包括图层在内的整个场景。MyScene::release被调用一次,主动调用[_myLayer release]时retain count减1,MyLayer::release被调用一次(通过[super dealloc] - 删除CCNode中的所有children),大家开心。
但是,一旦我完成了整个游戏(杀死设备上的应用程序)并调用了 CCDirector::end ,整个事情就中断了,因为事实上,它尝试释放 _myLayer 两次 - 一次使用显式调用,一次通过释放孩子。
现在我可以理解,如果这两种情况都相同,我犯了某种错误——但事实并非如此。一旦它按预期工作 - 在第一种情况下,将保留计数降低一个,然后再次释放它,一旦它以不同的方式工作。我不知道为什么会这样。
我尝试一起废弃 [_myLayer 版本]。在这种情况下,_myLayer 在运行时根本不会被释放,但在关机期间一切正常。所以这里有点一致,但这并没有真正帮助我。