2010-07-11 108 views
3

我最近接受了一次Objective-C測試,看看我會怎麼做。在dealloc和/或release上釋放/釋放對象嗎?

原來我的分數並沒有像我希望的那麼好。這意味着更多的學習。

在測試過程中,有人問我這樣一個問題:

你如何釋放一個對象?

A. [obj dealloc]; B. [obj release]; C.以上都不是

我的選擇是A,我不知道它是否正確。問題很混亂:不釋放調用dealloc,因此達到相同的結果?

回答

7

No. release遞減對象的引用計數。您可以直接撥打dealloc。調用release可減少引用計數,並在引用計數變爲零時讓運行時調用dealloc

+0

啊哈 - 有道理。謝謝 - 猜猜我錯了! – 2010-07-11 20:27:08

+1

其實,釋放你放棄對所有權的主張的信號,不多也不少。實際上,它通常意味着對象的保留計數將遞減,但不總是例如在釋放之前和之後檢查一個常量字符串的保留計數。 – JeremyP 2010-07-12 13:06:15

0

是,release不會調用dealloc但只有遞減引用計數且僅當引用計數去爲零。該NSObject class referencerelease

"Decrements the receiver’s reference count." 

"The receiver is sent a dealloc message when its reference count reaches 0." 
+0

這並不意味着該版本會鏈接到dealloc的調用。 GC將通過參考檢查發送該dealloc。只是想澄清。 – Jordan 2010-07-11 22:02:50

+1

GC永遠不會發送'dealloc'。 – bbum 2010-07-11 23:01:04

+0

非GC環境如何?這就是我想的。 – progrmr 2010-07-12 17:33:37

0

我知道答案已經接受了這一點,但我無法抗拒加入我自己的想法。

測試問題的答案在技術上是C.您不釋放對象,運行時認爲它們不再使用時釋放它們。

如果您在引用計數環境中釋放對象,則表明您沒有釋放該對象,僅表示您放棄所有權聲明。當沒有人擁有所有權聲明時,運行時會調用dealloc,並釋放對象。同樣,在垃圾收集環境中,當您覆蓋引用時,您表示您不再對其感興趣。一旦所有引用都消失了,在稍後的某個不確定的時間,finalize被髮送到對象並釋放對象。