2011-01-05 6 views
7

私はNSManagedObjectのサブクラスを持っています。ほとんどのプロパティは動的です(管理対象オブジェクトによって作成されます)が、@synthesizeとして作成されているいくつかのヘルパープロパティがあります。iphone NSManagedObject - 適切な解除方法ですか?

これらのオブジェクトを解放する正しい方法は何ですか?

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

または

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

答えて

11

オーバーライドdidTurnIntoFault、そこにそれらを解放。管理オブジェクトは、障害が発生したときに必ず割り当て解除されるわけではありません。

documentation:あなたはそれがになってきた後didTurnIntoFaultは通常、いくつかの時間のために再利用することはできません値が管理するオブジェクトをクリアするには良い時間ですのでdeallocまたはfinalizeをオーバーライドから推奨され

失敗。コアデータは、すべてのシナリオで(アプリケーション終了時など)deallocまたはfinalizeのいずれかが呼び出されることを保証しません。したがって、これらのメソッドでは、必要な副作用(ファイルシステムの保存や変更、ユーザー設定など)は含まれていないはずです。

+1

私のような、オーバーライドの名前で混乱している人たちに - willTurnIntoFaultは決してエラーまたは「フォールト」を示していません。それは循環からオブジェクトを取り除くためのCoreData用語です。 – jpswain

6

「コアデータプログラミングガイド」を詳しく見ることができます。これら2つの通路は、カスタムインスタンスに 変数を定義した場合、あなたはむしろ のdeallocよりdidTurnIntoFaultでこれらの の変数をクリーンアップするか、確定すべきである特に関連

です。

通常は のdeallocを上書きまたは一時 プロパティおよび他の変数をクリアするには、確定ではないはずです。 代わりに、 didTurnIntoFaultを上書きする必要があります。

4

[これは私が質問に別の問題を指摘しているためですが、コードの書式設定機能が必要です]。

はこれを行うことはありません:

オブジェクトがプロパティバッキングIVARで指さ放出するが、ポインタ自体がnilことはありません
[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を除いてどこでも好ましいです。

関連する問題