0

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

我有一个RootController对象对 a 有很强的引用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,使我能够在游戏类型之间进行交换,而无需知道除了它符合<TouchDelegate>协议之外的细节:

@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

最后,我有 GameplayLayer,它在必要时由 RootView 调用,应该由 RootView 释放:

@interface GameplayLayer : CCLayer <ModelViewDelgate, Updatable>
...
@property (nonatomic, assign) RootView *rootView;
@property (nonatomic, assign) RootController <TouchDelegate> *touchDelegate;
...
@end

当控制器类决定是时候清理游戏(通常是游戏的硬重置)时,实际上我项目中的所有其他类都被释放,除了这个 GameplayLayer,它从不接收 dealloc 方法。我错过了什么?这是我如何“重新开始”我的游戏...

[[CCDirector sharedDirector] replaceScene:[RootController node]];
4

1 回答 1

0

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

于 2013-04-30T13:32:33.950 回答