0

この保持サイクルを理解できません。誰かがそれを見つけるのを手伝ってくれれば幸いです。

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に準拠していること以外の詳細を知る必要なく、ゲームの種類を切り替えることができます。<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

最後に、必要に応じて RootView によって呼び出される GameplayLayer を用意し、RootViewによって割り当てを解除する必要があります。

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

コントローラー クラスがゲームのクリーンアップ (通常はゲームのハード リセット) を決定すると、私のプロジェクトの他のすべてのクラスは、dealloc メソッドを受け取ることのないこの GameplayLayer を除いて、文字通り割り当てが解除されます。私は何が欠けていますか?ゲームを「再起動」する方法は次のとおりです...

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

1 に答える 1

0

@JoshCaswell と @LearnCocos2D による示唆に富んだ質問のおかげで、問題を解決することができました。結局のところ、問題はありませんでした。Cocos2dの要件に従って、このonExitメソッドでは、その CCNode に以前に割り当てられていたタッチ デリゲートをすべて削除するように CCDirector に指示する必要があります。ただし、そのメソッドをオーバーライドする場合は、メソッドを終了する前に呼び出す必要があります[super onExit]。そうしないと、Cocos2d は子の削除に失敗し、特定の要素の割り当てが解除されません。

于 2013-04-30T13:32:33.950 に答える