方法getFoo
不返回具有0保留計數的對象。它返回一個+ 0的對象保留計數這意味着:
- 對象的保留計數不爲空(否則,對象將不存在)
- 並保留計數沒有改變通過調用該方法,或者如果是的話,它是一種平衡的方式(使用盡可能多的
release
/autorelease
作爲retain
/alloc
/new
/copy
)。
因此,對象的生命週期完全取決於它在哪裏以及如何保留。我們不知道對象將會有效多長時間,因爲任何方法調用可能會釋放對象。
例如,讓我們考慮下面的代碼:
id anObject = [anArray objectAtIndex:0];
[anArray removeObjectAtIndex:0];
目的anObject
不保留任何更多由陣列,因爲我們除去它。因此它可能已被破壞(但也許並不是因爲它仍然在其他地方使用)。
通常,從方法獲取一個對象時(其它的是alloc
,copy
,new
或retain
),我們可以假設:
- 任一對象被保留,然後自動釋放,
- 任一對象由返回它的對象保留。
所以我們知道對象foo
是有效的,直到我們從當前方法/函數返回或者我們調用的方法/函數,改變對象bar
,以先到者爲準的狀態。之後,它可能已經被破壞。
所以在你的情況下,你可以放心地省略retain
/release
對。
但是,要保證一個對象不會被釋放是非常困難的,除非我們知道我們調用的每個方法的實現。因此,保留(然後釋放)我們得到的每個對象都是更安全的方法,這就是編譯器在啓用ARC(自動引用計數)時將執行的操作。
但是,這將需要你寫很多retain
/release
和你的代碼會變得難以閱讀,理解和維護。而且,你寫的代碼越多,得到的錯誤就越多(除非你從不寫錯誤)。
總之,除非您有理由懷疑它可能會消失,否則不需要保留一個對象。
如果您在Xcode 4.2中打開ARC,所有這些廢話都會消失。 – ratbum 2012-07-09 10:08:02