我只是无法弄清楚这个保留周期,如果有人能帮助我发现它,我将不胜感激。
我有一个RootController
对象强有力地引用RootView
。
@interface RootController : CCNode <TouchDelegate, GUIDelegate, ModelViewDelgate>
...
@property (nonatomic, weak) CCDirector *director;
@property (nonatomic) RootView *view;
...
@end
@implementation
- (id)init {
...
_view = [[RootView alloc] initWithController:self];
[self addChild:_view];
...
}
return self;
}
@end
我有一个RootView
对象,它包含对控制器的引用,以及activeGame
,使我可以在游戏类型之间进行交换,而不需要知道除了符合{{ {1}}协议:
<TouchDelegate>
最后,我有GameplayLayer,必要时由RootView调用,应该由RootView释放:
@interface RootView : CCScene
...
@property (nonatomic, assign) RootController *controller;
@property (nonatomic) GameplayLayer <ModelViewDelgate> *activeGame;
...
@end
@implementation RootView
- (id)init {
...
self.activeGame = [[GameplayLayer alloc] initWithDelegate:_controller root:self type:type];
[self addChild:self.activeGame];
...
}
return self;
}
@end
当一个控制器类决定是时候清理游戏时(通常是游戏的硬重置),除了这个从未收到dealloc方法的GameplayLayer之外,我的项目中的每个其他类都被解除分配。我错过了什么?以下是我重新启动游戏的方式......
@interface GameplayLayer : CCLayer <ModelViewDelgate, Updatable>
...
@property (nonatomic, assign) RootView *rootView;
@property (nonatomic, assign) RootController <TouchDelegate> *touchDelegate;
...
@end
答案 0 :(得分:0)
感谢@JoshCaswell和@ LearnCocos2D的一些发人深省的提问,我们能够解决问题。事实证明,确实没有问题。根据Cocos2d的要求,在onExit
方法中,您必须告诉CCDirector删除先前分配给该CCNode的任何触摸代理。但是,如果重写该方法,则必须在退出方法之前调用[super onExit]
,否则Cocos2d将无法删除子项,因此某些元素将永远不会释放。