2011-02-04 74 views
2

爲什麼我會用(在我的dealloc方法中)?爲什麼myInstance = nil而不是self.myInstance = nil?

  1. [myInstance release]代替[self.myInstance release]
  2. myInstance = nil而不是self.myInstance = nil

雖然我們使用self.myInstance = [[[AClass alloc] init] autorelease]代替myInstance = [[[AClass alloc] init] autorelease]

這些做法來自我在網上看到的衆多例子。

+0

請搜索該網站。這個問題以前已經出現過很多次了。 – 2011-02-04 07:59:01

回答

1

1)將myInstance發佈]而不是[self.myInstance發佈]

更喜歡前者。

self.myInstance的返回值由子類已重寫方法myInstance的實現定義。你對dealloc期間構造對象的接口行爲不感興趣(因爲子類可能會覆蓋並返回除你的ivar以外的東西)。

你對dealloc感興趣的是在你的對象被銷燬之前釋放你擁有的引用。如果子類已覆蓋myInstance,那麼它可以:

一)返回伊娃(在子類中聲明),這已經被釋放

二)覆蓋的實施可能會返回一個新創建自動釋放對象

a或b可能導致過度釋放和崩潰(假設其他所有內容都正確保留/釋放)。這也說明了爲什麼你應該在釋放伊利爾後將它分配給伊娃。

這也是如何觸發對象復活的經典例子。當你調用的getter/setter的實現在它已經被釋放後重新創建它的狀態時,就會發生對象復活。最少的攻擊性副作用會導致無害的泄漏。

2)將myInstance =零,而不是self.myInstance =零

再次,傾向於前者。

正式回覆看起來很像對#1的迴應 - 理由,副作用和危險也適用於此處。

來處理這個最安全的方式是直接訪問伊娃:

[myInstance release], myInstance = nil; 

,因爲有可能是得了很嚴重的副作用(崩潰,泄漏,復活),這可能是難以重現。

這些危險可能很容易避免,您的代碼將更容易維護。另一方面,如果人們在使用你的程序時遇到了副作用,他們可能會避免(重新)使用它。

好運

1

調用self.myInstance =使用自動生成的setter方法。調用[self.myInstance release];調用getter方法返回的對象的釋放。這一切都取決於你的財產如何建立(保留,分配?)。你的問題沒有必然的正確或錯誤的答案,因爲這一切都取決於有問題的財產。我建議你閱讀Objective C properties以獲得更好的感覺。

,除非將myInstance與分配宣佈,你不會想打電話給self.myInstance = [[AClass alloc] init]你會用self.myInstance好得多= [[[AClass alloc] init] autorelease]

1

這取決於您在接口中定義的屬性。例如,如果你定義保留產權:

@property (nonatomic, retain) NSObject *property; 

,那麼你可以在dealloc方法只使用self.property = nil;,因爲它等於:

[property release]; // releases previous property 
property = [nil retain]; // [nil retain] returns just nil 

同樣的事情與self.property = [[A alloc] init];。這相當於

[property release]; // releases previous property 
property = [[[A alloc] init] retain]; 

如果是property = [[A alloc] init];屬性將不會被保留。

Here's一個完整的屬性指南形式蘋果。

+0

致@kovpas,您的鏈接到期。這是一個:https://developer.apple.com/library/mac/documentation/cocoa/conceptual/codingguidelines/Articles/NamingIvarsAndTypes.html – Cong 2013-11-03 06:31:06

0

實際使用

self.myInstance = [[AClass alloc] init]; 

將在內存泄漏導致,原因self.myInstance使用setter方法,這導致在保持與+1的alloc沿/初始化保留1。所以你會得到一個保留計數+2;

0
... = self.myInstance 

self.myInstance = ... 

實際上是子程序或方法調用getter和setter方法,這取決於你如何定義這些子程序,或有Objective C的屬性創建它們,幾乎可以爲所欲爲。

如果保留屬性的情況下,子例程可能會使用保留計數。如果你做自己的getter和setter,你可以讓他們控制你房子裏的燈光,把它們打開爲零,並將零點或零點設置爲零時熄滅燈光。這裏甚至不需要被命名爲 「實例」 的背變量,它可以通過設置:

instance = ... 
1

注意使用

myInstance = nil 

代替

self.myInstance = nil 

那是不正確的(中說,在一個UIViewController子類viewDidUnload方法的情況下),如果將myInstance是保留屬性,因爲如果myInstance指向一個對象,它將被泄漏!

相關問題