2012-05-27 87 views
2

在我的「connect4」風格的遊戲中,我有一個代表7x6網格的數組,數組中的每個「單元格」都包含NSNull或UIView子類'CoinView'。以下是從NSMutableArray和主視圖中刪除對象的正確方法嗎?正確地從視圖和數組中刪除對象?

- (IBAction)debugOrigin:(id)sender { 
    int x = 0; 
    int y = 0; 
    //get the coin object form the grid 
    CoinView *coin = [[grid objectAtIndex:x] objectAtIndex:y]; 

    //cancel if there's no coin there 
    if ([coin isKindOfClass:[NSNull class]]) { return; } 

    //remove the coin from memory 
    [coin removeFromSuperview]; 
    coin = nil; 
    [[grid objectAtIndex:x] setObject:[NSNull null] atIndex:y]; //will this leak? 

} 

謝謝!

+1

如果你使用ARC,這應該沒問題。使用[array setObject:atIndex]將從數組中移除任何先前的對象,並在幕後自動釋放它。如果CoinView被保存到其他任何地方,它仍然存在 - 但由於這種性質,它不是泄漏,因爲某些東西仍然會引用它 – CrimsonDiego

回答

3

你的代碼不會泄漏,事實上(幾乎)是正確的。

您應該刪除此評論,因爲你不存儲在你的代碼處理(和它最終可能會迷惑你,什麼代碼確實):

//remove the coin from memory 

在以下行你「再去除它的父的局部變量‘硬幣’中所引用的觀點:

[coin removeFromSuperview]; 

你分配零到本地變量的硬幣,這是很好的做法,以確保它沒有被在後面的代碼中使用:

coin = nil; 

據我所知,對於NSMutableArray沒有setObject:AtIndex:。使用replaceObjectAtIndex:withObject:代替:

[[grid objectAtIndex:x] replaceObjectAtIndex:y withObject:[NSNull null]]; //will this leak? 

作爲最後一個音符,我建議你閱讀了關於memory managementmemory leaks位(從蘋果的開發者文檔)。第一個提供了一些提示和技巧,使內存管理更容易理解。

+2

將代碼置於文本中時,用反引號(\)對其進行分隔,不是星號。這樣,它將是等寬的,更容易閱讀,而不是斜體。 – Greg

+0

完成,謝謝你的提示。 – diegoreymendez