2010-06-08 20 views
2

我試圖鎖定我對Objective-C中適當內存管理的理解。dealloc期間自我使用的解釋?

我養成了明確聲明self.myProperty而不僅僅是myProperty的習慣,因爲偶爾遇到一個屬性不會被設置爲我想要的引用的情況。

現在,我正在閱讀關於發佈IBOutlets的Apple文檔,並且他們說在dealloc期間應將所有網點設置爲nil。所以,我把這個地方如下,經驗豐富的崩潰的結果:

- (void)dealloc { 
    [self.dataModel close]; 
    [self.dataModel release], self.dataModel = nil; 
    [super dealloc]; 
} 

於是,我試着取出「自我」的引用,就像這樣:

- (void)dealloc { 
    [dataModel close]; 
    [dataModel release], dataModel = nil; 
    [super dealloc]; 
} 

這第二個系統似乎按預期工作。但是,這讓我有點困惑。爲什麼在這種情況下self會導致崩潰,當時我認爲self是一個比其他任何東西更形式化的比較溫和的參考?另外,如果self在這種情況下不合適,那麼我不得不問:什麼時候應該包含self引用,以及何時不應該?

回答

1

我在看到蘋果示例代碼和iphone開發書籍後採用了以下內容。

組出口到「viewDidUnload」(使用自助存取器)無 釋放他們的「的dealloc」(無SELF)

- (void)viewDidUnload { 
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
    self.button = nil 
} 


- (void)dealloc { 
    // no SELF 
    [button release]; // UI objects 
    [images release]; // model objects 
} 
1

[self.dataModel release]將發佈對您不擁有的dataModel的引用。後續self.dataModel = nil相當於調用[self setDataModel:nil],並且setter方法將自行釋放您已完成的dataModel

最簡單的事情就是只有self.dataModel = nil

作爲一個更一般的觀點,self.blah不只是訪問字段的禮貌方式。它調用一個方法,可能有副作用。這種副作用的目的應該是使生活更安全和更容易。如果你忘記了這個方法正在被調用,那麼它會導致混淆,就像這裏一樣。正確只要你聲明屬性的默認實現將做到這一點屬性 - -

作爲一項規則,你應該組織你的財產的方法來封裝內存管理棘手的東西,然後把它留給他們 。混合和匹配你自己的內存管理和你的財產方法的內存管理幾乎總是會讓你感到最後。

+0

所以是這樣說,當你在上面合成的屬性的實現,僅僅在dealloc方法中將其設置爲零就足夠了? – bigmac 2010-06-08 18:21:54

+1

不要使用self.dataModel = nil,只需使用[dataModel release] ;.通過訪問器將屬性設置爲零可能會導致通知被觸發。您不希望任何通知在dealloc期間觸發,因爲您的對象正處於被銷燬的過程中。 – 2010-06-08 19:50:46

相關問題