2012-06-06 40 views
1

我們是否在快速枚舉中釋放參數?因此,此代碼是準確的:我們是否在快速枚舉中釋放參數

for (MKCircle *circle in localOverlays) { 

    [mapView addOverlay: circle]; 

    [circle release]; // Is it perfectly alright to call this? 
} 

我只是想知道,我第一次使用快速枚舉!

回答

6

答案是在Apple Memory Management Rules

  • 你擁有的任何對象創建

    您可以使用其名稱以「黃金」,「新」,「複製」,或「mutableCopy」

的方法創建一個對象

您是否創建了circle?第

您可以使用對象的所有權保留

你留住circle?號碼

所以你不擁有這個對象。

你一定不會放棄對象的所有權不屬於您

這似乎是相當簡單的,現在你已經確定你沒有自己circle。您問題中示例代碼中的版本不應該在那裏。事實上,最有可能的是,它會導致墜毀事故的發生。

+0

這是一個13歲的孩子最全面和詳細的...謝謝! – MCKapur

1

快速枚舉不通常創建新的對象,它是通過現有的。這就是爲什麼它幾乎從不是正確的做法:快速枚舉常規容器(NSArray,NSSet,NSDictionary)在將對象提供給循環之前不會保留對象,因此釋放它們將是錯誤。即使在dealloc方法中,也不應該這樣做:釋放容器也會釋放它的項目,所以你不應該單獨釋放它們。

1

不,我認爲這不是正確的做法。它既不做retain也不是release到實例

for (MKCircle *circle in localOverlays) { 

    [mapView addOverlay: circle]; //retain here 
} 

addOverley:應該做一個保留circle,這是MapView類的責任release時的MapView並不需要它

簡單的指南,你retain它,release當你用完它