1)將myInstance發佈]而不是[self.myInstance發佈]
更喜歡前者。
self.myInstance
的返回值由子類已重寫方法myInstance
的實現定義。你對dealloc期間構造對象的接口行爲不感興趣(因爲子類可能會覆蓋並返回除你的ivar以外的東西)。
你對dealloc感興趣的是在你的對象被銷燬之前釋放你擁有的引用。如果子類已覆蓋myInstance
,那麼它可以:
一)返回伊娃(在子類中聲明),這已經被釋放
或
二)覆蓋的實施可能會返回一個新創建自動釋放對象
a或b可能導致過度釋放和崩潰(假設其他所有內容都正確保留/釋放)。這也說明了爲什麼你應該在釋放伊利爾後將它分配給伊娃。
這也是如何觸發對象復活的經典例子。當你調用的getter/setter的實現在它已經被釋放後重新創建它的狀態時,就會發生對象復活。最少的攻擊性副作用會導致無害的泄漏。
2)將myInstance =零,而不是self.myInstance =零
再次,傾向於前者。
正式回覆看起來很像對#1的迴應 - 理由,副作用和危險也適用於此處。
來處理這個最安全的方式是直接訪問伊娃:
[myInstance release], myInstance = nil;
,因爲有可能是得了很嚴重的副作用(崩潰,泄漏,復活),這可能是難以重現。
這些危險可能很容易避免,您的代碼將更容易維護。另一方面,如果人們在使用你的程序時遇到了副作用,他們可能會避免(重新)使用它。
好運
請搜索該網站。這個問題以前已經出現過很多次了。 – 2011-02-04 07:59:01