2011-12-12 40 views
1

首先,我是一個Objective-C的新手。 :)Objective-C,所有權和類方法

我知道任何以alloc,newcopy開頭的東西都會給返回對象的調用者所有權。這是否也適用於類方法?我猜測它確實是,最近一次我的單元測試崩潰似乎證實了它。 Apple的高級內存管理編程指南不會說類和實例方法之間是否有區別。

更新 我的意思是它也適用於類方法真的是「逆」。例如,NSDecimalNumber有一個名爲+decimalNumberWithDecimal:的類方法。它似乎返回一個自動釋放的對象(如果我明確地釋放它,在此之後不久就會發生崩潰)。事後看來,我的問題的答案是顯而易見的,因爲Apple的指南將newalloc稱爲所有權授予方法,並且它們都是類方法。抱歉佔用你寶貴的時間。 :)

+0

你是指爲你生成一個對象的類方法嗎? 當然可以。這種模式是obj-c中內存管理的一個關鍵。即使非蘋果框架適用於這種模式。 – yinkou

回答

3

是的,這適用於類方法,因爲allocnew是將所有權歸還給調用者的類方法。應該使用copymutableCopy的前綴作爲返回所有權的實例方法。

編輯進行更新:

你是正確的像+decimalNumberWithDecimal:的方法將返回一個自動釋放的對象,因此沒有理由將其釋放。但是,如果他們決定命名方法+newNumberWithDecimal:,那麼您將擁有所返回對象的所有權並需要將其釋放。鐺靜態分析器實際上會抱怨,如果你用new前綴一個方法並返回一個自動釋放對象。

+0

@JeffWolski:蘋果的編程指南明確提到'拷貝'(和變體)作爲賦予所有權的方法。看到這裏:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html –

3

allocreleaseinit不表示所有權,您可能會將其與alloc混合。您可以使用助記符NARC輕鬆記住它。

如果您正在命名任何類方法init,copyretain,您應該停止該方法。那些只是在實例環境中才有意義的方法。 allocnew是類方法,只能在該上下文中使用。不要命名實例方法allocnew

指南並沒有說它適用於實例方法和類方法的原因是所討論的方法顯然是兩者的混合,所以很明顯就是這樣。

+0

是的,我混合init與新! :) –

3

實際上,這幾乎是正確的。 alloc,newcopy給你返回對象的所有權。這些是類方法。其他類方法應該返回一個自動釋放對象。實例方法也應該返回一個自動釋放對象。

init不影響所有權,應與alloc一起使用如下。

[[SomeCoolClass alloc] init] 

new通常是同樣的事情之上,並且有時被描述爲「幾乎過時」,因爲它是一個倒退到當分配和初始化在同一步驟中完成,不能情節接下來的日子裏除了今天我們用allocinit

發佈不會影響所有權,但應僅用於您已擁有的對象。否則可能會發生崩潰。

保留也不影響所有權,但只應用於您已擁有的對象。否則,該對象可能不會被釋放。結果可能是崩潰,但它也可能是非常非常奇怪的行爲,難以排除故障,因爲消息可能會發送到原本應該被解除分配的對象,而不是指向同一地址的新對象。