2011-01-05 43 views
7

我有一個NSManagedObject的子類,大多數屬性是動態的(由託管對象創建),但我有一些幫助屬性正在創建爲@synthesize。iphone NSManagedObject - 解除分配的正確方法?

什麼是釋放這些對象的正確方法?

- (void)didTurnIntoFault 
{ 
    [self.randomVar release]; 
    [super didTurnIntoFault]; 
} 

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

回答

11

覆蓋didTurnIntoFault並釋放他們那裏。管理對象在發生故障時不一定會解除分配。

documentation

您是從覆蓋deallocfinalize因爲didTurnIntoFault通常是已經變成了後一個更好的時間來清除值,一個管理對象可能不會被回收了一段時間氣餒故障。核心數據不保證在所有情況下(例如應用程序退出時)都會調用deallocfinalize;因此您不應在這些方法中包含所需的副作用(如保存或更改文件系統,用戶首選項等)。

+1

對於像我這樣被覆蓋名稱困惑的人來說 - willTurnIntoFault並不以任何方式指示錯誤或「錯誤」,它只是CoreData術語,用於使對象不流通。 – jpswain 2011-08-01 22:35:39

6

您可能想仔細看看核心數據編程指南。這兩段話是特別重要

的如果定義自定義實例變量 ,應該清理一下這些 變量didTurnIntoFault而 比的dealloc或敲定。

您通常不應覆蓋 的dealloc或完成清除瞬態 性質和其他變量。 相反,您應該覆蓋 didTurnIntoFault。

4

[這應該是真的,因爲我指出不同的問題,以問題的評論,但我想要的代碼格式化功能。

永遠不要這樣做:

[self.randomVar release]; 

釋放對象由酒店後盾伊娃指出,但不會使指針本身爲零。這意味着你現在可能有一個懸掛指針,如果釋放導致對象被處理。任一這樣做:

self.randomVar = nil; 

或該

[randomVar release]; // assumes the property is backed by an ivar of the same name. 
randomVar = nil;  // can be omitted if you are in dealloc 

第一種形式的任何地方,優選除了在的dealloc。