2012-06-25 31 views

回答

4

號這是因爲使用的是retain選項生成的@synthesized方法(或strong,如果你使用ARC)實際上是這個樣子:

- (void)setValue:(NSString *)newValue { 
    [value autorelease]; 
    value = [newValue retain]; 
} 

因此,當你做self.property = nil,舊的價值將被自動釋放,並且nil將被保留,反正什麼也不做。

當你只是做iVar = nil,你永遠不會釋放對象變量先前包含,所以你泄漏。

當然,如果你使用ARC(自動引用計數),你不必擔心任何這些。編譯器會爲你完成這項工作。在這種情況下,iVar = nil的效果與self.iVar = nil的效果完全相同,但有些人可能會認爲它不太清晰。

+0

只有當你不使用ARC時,這纔是真實的。如果使用ARC,即使未調用setter方法(假設屬性/ ivar的所有權限定符爲「強」),對象也會被釋放。儘管如此,國際海事組織,最好明確地調用setter。 –

+0

@Andrew這是一個很好的觀點,但由於您不必擔心ARC中的保留/發佈,我認爲他在本例中使用了手動引用計數。不過,我想我可以編輯它,但爲了安全起見。 –

+0

將伊娃設置爲零而不使用屬性訪問器工作,但是否定了具有屬性的關鍵點。如果您正在使用訪問器,並且稍後決定在更改屬性值時需要發生某些事情,則只需將代碼添加到訪問器方法即可。如果您不使用訪問器並想要這樣做,那麼您必須搜索您直接觸摸伊娃的每個地方。 – rickster

相關問題