2011-06-28 62 views
0

如果我想在另一個類中分配一個類,我想很容易地引用它,但是有時候這個類不需要被分配,因此不會被分配。這是如何完成的?我可以在dealloc中放置一個條件,因此它不必被釋放?有條件的alloc/dealloc? [Objective-c and 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需要保持引用,以便它可以滾動的地圖。但如果我沒有分配它,我怎麼不去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

確保可選變量在不需要時爲零,並且在釋放之前執行無核查。

+2

'nil'檢查是不必要的 - 向'nil'發送'release'消息是安全的。 – mipadi

+0

你可以這麼做......我認爲它是草率的代碼,並儘可能地避免它。 – Perception

+0

是的,但你只是添加更多的代碼,什麼都不做,對吧? – VagueExplanation