NSManagedObjectのカスタムサブクラスを使用するCoreDataエンティティがあります。CoreDataの属性または関係に関連付けられていないインスタンス変数とプロパティがいくつかあります。私がやっていることの例はこれです:
@interface Root : NSManagedObject
{
Foo *foo;
Bar *bar;
}
@property (nonatomic, retain) Foo *foo;
@property (nonatomic, retain) Bar *bar;
// Core Data generated
@property (nonatomic, retain) Node *relationship;
@property (nonatomic, retain) NSString *attribute;
-(void)awake;
@end
@implementation Root
@synthesize foo;
@synthesize bar;
@dynamic relationship;
@dynamic attribute;
-(void)awakeFromInsert {
[super awakeFromInsert];
[self awake];
}
-(void)awakeFromFetch {
[super awakeFromFetch];
[self awake];
}
-(void)awake {
Foo *newFoo = [[Foo alloc] init];
self.foo = newFoo;
[newFoo release];
// bar is not automatically initialized, but can be set by something external
}
-(void)didTurnIntoFault {
[foo release];
foo = nil;
[bar release];
bar = nil;
[super didTurnIntoFault];
}
@end
これで、私のアプリでは、アプリの起動時にフェッチリクエストによってルートのインスタンスを1回取得し、アプリが終了するまでそれを保持します。(実際には、ルートインスタンスを削除して新しいインスタンスを作成できるため、少し複雑ですが、一度に1つしか存在せず、保持されます。)したがって、アプリが終了するまで、didTurnIntoFaultが呼び出されないことを願っています。もしそうなら、ある時点で私はroot.fooまたはroot.barを参照し、nilを取得します。それは私のアプリのエラーになります。ルートインスタンスには、fooとbarの値が常にnil以外である必要があります。fooはインスタンスがロードされるたびに作成され、barはルートインスタンスをフェッチした直後に呼び出し元によって設定されます。
コードがNSManagedObjectを保持している場合、didTurnIntoFaultが呼び出されないことに依存できますか?
didTurnInfoFaultが呼び出されたくない場合、なぜそれを持っているのですか?さて、私はいつか片付けなければなりません。プログラムが終了するまでこれらのインスタンス変数を解放したくない場合は、そのコードを実際にdeallocに入れる必要があります。しかし、NSManagedObjectのサブクラスにdeallocを使用することを思いとどまらせるいくつかのドキュメントを読んだと思います。