我們是否在快速枚舉中釋放參數?因此,此代碼是準確的:我們是否在快速枚舉中釋放參數
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
我只是想知道,我第一次使用快速枚舉!
我們是否在快速枚舉中釋放參數?因此,此代碼是準確的:我們是否在快速枚舉中釋放參數
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle];
[circle release]; // Is it perfectly alright to call this?
}
我只是想知道,我第一次使用快速枚舉!
答案是在Apple Memory Management Rules。
的方法創建一個對象
你擁有的任何對象創建
您可以使用其名稱以「黃金」,「新」,「複製」,或「mutableCopy」
您是否創建了circle
?第
您可以使用對象的所有權保留
你留住circle
?號碼
所以你不擁有這個對象。
你一定不會放棄對象的所有權不屬於您
這似乎是相當簡單的,現在你已經確定你沒有自己circle
。您問題中示例代碼中的版本不應該在那裏。事實上,最有可能的是,它會導致墜毀事故的發生。
快速枚舉不通常創建新的對象,它是通過現有的。這就是爲什麼它幾乎從不是正確的做法:快速枚舉常規容器(NSArray
,NSSet
,NSDictionary
)在將對象提供給循環之前不會保留對象,因此釋放它們將是錯誤。即使在dealloc
方法中,也不應該這樣做:釋放容器也會釋放它的項目,所以你不應該單獨釋放它們。
不,我認爲這不是正確的做法。它既不做retain
也不是release
到實例
for (MKCircle *circle in localOverlays) {
[mapView addOverlay: circle]; //retain here
}
addOverley:應該做一個保留circle
,這是MapView類的責任release
時的MapView並不需要它
簡單的指南,你retain
它,release
當你用完它
這是一個13歲的孩子最全面和詳細的...謝謝! – MCKapur