Cocos2d代表保留周期

时间:2013-04-30 00:20:00

标签: objective-c cocos2d-iphone

我只是无法弄清楚这个保留周期,如果有人能帮助我发现它,我将不胜感激。

我有一个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

1 个答案:

答案 0 :(得分:0)

感谢@JoshCaswell和@ LearnCocos2D的一些发人深省的提问,我们能够解决问题。事实证明,确实没有问题。根据Cocos2d的要求,在onExit方法中,您必须告诉CCDirector删除先前分配给该CCNode的任何触摸代理。但是,如果重写该方法,则必须在退出方法之前调用[super onExit],否则Cocos2d将无法删除子项,因此某些元素将永远不会释放。