2009-09-04 59 views
3

我正在重讀Cocoa Programming for Mac OS X的前幾章,作者指出NSCalendarDate的類方法之一會返回一個自動釋放對象。我總是認爲所有類方法都返回了一個自動釋放對象(因爲沒有涉及到alloc)。所有的類方法都返回一個自動釋放對象嗎?

是否有任何需要特別保留的類方法?

謝謝。

+1

從技術上講,如果一個方法沒有返回一個自動釋放對象,你*不會*必須保留結果。它可能已被保留,或者代碼會出錯,以致返回的對象可能已被釋放。 – Chuck 2009-09-04 21:09:31

回答

22

類的方法,就像實例方法一樣,應該遵循標準Cocoa memory management rules

你把一個對象的所有權,如果你 使用其名稱 開始「黃金」或「新」或 包含「複製」的方法創建它(例如,分配, NEWOBJECT,或mutableCopy) ,或者如果你 發送一個保留消息。您是 負責使用 發佈或autorelease放棄 您擁有的對象的所有權。任何其他時間您收到一個對象 ,您一定不能釋放它 。

大概他們正在返回一個autoreleased對象,或者是一個單例或類似的東西的引用。無論哪種方式,除非以「alloc」或「new」開頭或包含「copy」,否則不需要釋放對象。你不需要保留它,除非你希望將它放在當前自動釋放池的範圍內,將它存儲在一個iVar或類似的東西中。

+3

澄清一點:對於單例,*類*擁有其唯一的實例,這就是爲什麼它不釋放或自動釋放它的原因。在所有其他情況下(通常爲便利工廠方法,例如'stringWithUTF8String:'),類不打算擁有該實例,因此它會自動釋放它。 – 2009-09-04 11:47:45

+1

爲了加強Joey的說法 - 你關心的唯一事情就是Cocoa內存管理規則中規定的對象所有權。問題是「我擁有返回的對象」,而不是「我稱之爲自動釋放它的方法」。 – 2009-09-04 15:13:09

+0

+1爲一個很好的答案。看到我的答案進行一些額外的分析。 – 2009-09-04 15:33:45

0

一般規則是,如果方法的名稱包含alloc,new或copy,那麼您擁有它。否則,它可能會被自動釋放,或者被其他人照顧,即你不擁有它,所以你不必擔心它。

1

便捷方法通常會返回自動釋放對象。例如。 [NSMutableArray數組]相當於[[[[NSMutableArray alloc] init] autorelease]。

事實上,這些都是類方法,不應該讓你得出所有類方法都返回自動釋放對象的結論。這完全是關於命名約定。如果menthod有一個alloc *,複製,new * name,那麼你將是返回對象的所有者。即傳給你時,它的保留數至少爲1。

1

這是值得記住的是類方法不在所有返回一個對象 - 任何方法都可以返回什麼(包括結構,基本類型等)或沒有(無效)。 Objective-C語言中沒有什麼要求類方法返回一個無主對象(這意味着調用者不需要釋放/自動釋放它)。

這就是說,@喬伊的回答是一個偉大的。返回對象的類方法的經驗法則是應該自動釋放。應該明確記錄約定中的斷點,以避免在客戶端代碼中導致內存泄漏。

相關問題