2010-10-28 55 views
2

通常我寫我的dealloc看起來像這樣:在dealloc的iVars上使用self?

- (void)dealloc { 
    [coffeeList release]; 
    [super dealloc]; 
} 

但今天我輸入(見下文),有點疑惑,爲什麼我得到了橫貫CLANG靜態分析代碼中的錯誤。正如我所說的,我通常不會在dealloc中將自己添加到iVars中,但是當我發現這是發生了什麼時,我只是有點好奇。

- (void)dealloc { 
    [[self coffeeList] release]; 
    [super dealloc]; 
} 

加里。

回答

1

因爲這是非常糟糕的形式,並且違背了你應該如何做的事情。 CSA不僅檢查語義錯誤,還檢查你是否按照你應該的方式做事。你應該怎麼做,在文檔中是如何完成的。

+0

我只是新的objective-c,但對我的眼睛都[[self coffeeList]發佈];和[coffeeList發佈];似乎是一樣的。雖然看起來語法會混淆LLVM 1.5 CLANG。 – fuzzygoat 2010-10-28 16:47:55

+0

他們不一樣。內存管理規則告訴你只發布你擁有的對象。這裏發生的是'[self coffeeList]'擁有'coffeeList',而不是你。它實現的基本原理是:'return [[coffeeList retain] autorelease];'如果你知道你的規則,就意味着它擁有coffeeList,並且將在未來某個任意點發布。您需要直接*釋放伊娃。 – jer 2010-10-28 17:19:50

+0

謝謝你,正是我所追求的,我想了解發生了什麼,現在我明白了。非常感謝... – fuzzygoat 2010-10-28 19:56:10

4

我只是猜測,鐺聲明[self something] release(或[self.something release])違反內存管理公約。從名稱中沒有「新」,「初始」或「複製」的方法返回的對象應該是自動釋放的,因此再次釋放它似乎是過度釋放錯誤。

0

coffeeList是否聲明爲屬性(並設置爲保留)?那麼你應該這樣做:

[self.coffeeList release]; 
+2

[self.coffeeList發佈]和[[self coffeeList]發佈]完全相同的調用。 – gcamp 2010-10-28 16:15:07

+0

這是... .... @property(nonatomic,retain)NSArray * coffeeList; – fuzzygoat 2010-10-28 16:26:34

+2

改爲'self.coffeeList = nil;'而不是。確保你首先刪除'coffeeList'上的觀察者,如果有的話,否則他們會被要求去掉一個對象。 – Michal 2010-10-28 17:54:05

相關問題