2011-06-28 5 views
0

クラスを別のクラスの内部に配置したいと思ったら、簡単に参照したいのですが、このクラスをalloc'dする必要はないため、deallocされません。これはどうですか? deallocの中に条件付きを入れて解放する必要はありませんか?条件付きのalloc/dealloc? [Objective-cとCocos2D]

さらに詳しくは、私はCocos2Dを使用しています。割り当てられる必要があるかもしれないし、ないかもしれないプレーヤー能力クラスがあります。私の初期設定で:

// Abilities 
    if(abilityRushH == 0){ 
     objects = [theMap objectGroupNamed:@"oj"]; 
     startPoint = [objects objectNamed:@"item_ability_rushH"]; 
     x = [[startPoint valueForKey:@"x"] intValue]; 
     y = [[startPoint valueForKey:@"y"] intValue]; 

     rushH = [[RushHorizontal alloc] init]; 

     [self addChild:rushH.rushHSpriteSheet]; 

     rushH.rushHSprite.position = ccp(x,y);    
    } 

    if(abilityRushV == 0){ 
     objects = [theMap objectGroupNamed:@"oj"]; 
     startPoint = [objects objectNamed:@"item_ability_rushV"]; 
     x = [[startPoint valueForKey:@"x"] intValue]; 
     y = [[startPoint valueForKey:@"y"] intValue]; 

     rushV = [[RushVertical alloc] init]; 

     [self addChild:rushV.rushVSpriteSheet]; 

     rushV.rushVSprite.position = ccp(x,y); 
    } 

Cocos2Dはマップをスクロールできるように参照を保持する必要があります。しかし、私はそれをalloc'ingていない場合、私はどのようにdeallocしないのですか?

+0

「Cocos2D」は参照を保持する必要がありますか?それはそれ自身の目的のために変数をインスタンス化しますか? –

+0

うん。ポジションを設定した直後にrushHとrushVをリリースすると、ゲームはうまく始まりますが、マップを移動するとすぐにクラッシュします。私のコードでは、プレイヤーがマップ上でそれらのオブジェクトと衝突するまでそれらのオブジェクトを参照する場所はありません。そのため、Cocos2DはrushHとrushVをマップと一緒に移動させるために参照を使用している必要があります。 – VagueExplanation

+0

割り振る前に 'rushH'と' rushV'が 'nil'であるのをチェックしてみませんか?それらを記録する。 –

答えて

3

あなたはdeallocにそれをリリースすると話しているので、このためのインスタンス変数があります。 Objective-Cクラスのインスタンスが割り当てられると、すべてのオブジェクトはnilになり、cタイプは0(または同等の値)に設定されます。インスタンス変数がnildealloc)になるため、クラスのオブジェクトがインスタンス化されていないため、releaseメッセージが送信されても​​効果はありませんので、余分な労力を必要としません。

+0

オブジェクトを割り当てずに同じ名前のdeallocで解放すれば、何の効果もありません。 – VagueExplanation

+0

はい。これはインスタンス変数であり、メソッド変数では当てはまりません。メソッド変数はデフォルトで 'nil'ではありません。インスタンス変数は次のとおりです。 –

+0

ああ、ありがとう! – VagueExplanation

0

省略可能な変数が不要な場合はnilであることを確認し、解除する前にはnilチェックを行います。

+2

'nil'チェックは不要です。' release'メッセージを 'nil'に送っても安全です。 – mipadi

+0

あなたはそれを行うことができます...私はそれが厄介なコードと考え、可能な限り避けてください。 – Perception

+0

それでは、何もしないコードを追加しているだけですよね? – VagueExplanation