夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【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を使わずにそのオブジェクトにアクセスできるようにすれば良さそうですね。