【Objective-C, cocos2d】イニシャライザ内でself.parentを参照すると危険
またハマりました。
イニシャライザ内の処理でcocos2dのノード階層上の親ノードにアクセスするためにself.parentを使うとハマります。というより、その時点では親ノードにはつながっていません。例えば、
MyClass* myobj = [[MyClass alloc] init];
[self addChild:myobj];
のようなプログラムがあり、MyClassのinitメソッドで、
@implementation MyClass - (id)init { if ((self = [super init])) { CCSprite* sprite = [CCSprite spriteWithFile@"test.png"]; [self.parent addChild:sprite]; } return self; } @end
などとやろう物なら[self.parent addChild:sprite];の時点ではself.parentはnilなので、何もおこらず、スプライトは表示されません。クラッシュもしないので厄介です。
どういう順番で処理が進んでいるのかをちゃんと意識していないとだめですね。回避方法としてはinitではスプライトを作らずに別のメソッドにその処理を実装し、myobjをaddChildした後でそのメソッドを呼ぶか、あるいはMyClassをシングルトン形式で実装し、self.parentを使わずにそのオブジェクトにアクセスできるようにすれば良さそうですね。