這不是使用或不使用autorelease的問題,因爲在某些情況下,autorelease是唯一的方式,你會通過。問題應該是「爲什麼不在所有對象上使用autorelease,而不是使用保留和釋放?」。
要回答這個問題,你應該先了解一下autorelease的正確用法。假設您有一個具有兩個屬性的類:firstName和lastName。每個都有一個getter和一個setter。但你也需要,將返回全名,由這兩個字符串連接成一個全新的字符串的方法:
- (NSString *) fullName {
NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
// this is not good until we put [str autorelease];
return str;
}
什麼是錯的畫面?返回字符串的引用計數爲1,所以如果你不想泄漏,調用者應該在他完成時釋放它。從來電者的角度來看,他只是要求物業價值fullName
。他沒有意識到他得到了一個全新的對象,他應該在使用後釋放它,而不是對該類內部持有的NSString的引用!
如果我們在返回之前放置[str release]
,字符串將被銷燬,並且該方法將返回垃圾!這是我們使用[str autorelease]
的地方,以便稍後標記對象以便發佈(通常在事件處理完成時)。這樣調用者可以獲得他的對象,並且不必擔心他是否應該釋放它。
約定是在方法將其返回給調用方之前,在新對象上調用autorelease。例外情況是名稱以alloc
,new
或copy
開頭的方法。在這種情況下,呼叫者知道爲他們創建了一個全新的對象,他們有義務調用該對象的釋放。
完全用autorelease替換release是一個壞主意,因爲對象會很快堆積並堵塞內存,特別是在循環中。 iPhone上的資源是有限的,所以爲了最大限度地減少內存佔用,完成它之後立即釋放對象是您的職責。
高興地幫助(給我一些東西來搜索:-) – TofuBeer 2009-03-05 05:58:00
他們沒有提到的是很多基金會的調用autorelease對他們管理的對象,因此在緊密的循環中,你需要創建和管理你的類如果您正在處理適量的數據,則擁有自己的自動釋放池。 – rpetrich 2009-03-05 07:06:43