2

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を使用することを思いとどまらせるいくつかのドキュメントを読んだと思います。

4

2 に答える 2

2

オブジェクトが基になるファイルストアに存在する場合、メモリ不足の警告などが原因で、いつでもオブジェクトがフォールトアウトする可能性があります。

しかし、あなたのコードからは、必要なのは単純な遅延初期化プロパティ、つまり次のように「foo」ゲッターをオーバーライドすることだけのように見えます。

- (Foo *)foo
{
    if (!foo) {
        foo = [[Foo alloc] init];
    }

    return foo; // or [[foo retain] autorelease] if you need that safety
}

これはnilを返さないことが保証されており、didTurnIntoFaultが必要な場合は、インスタンス変数を解放してnilアウトすることができます。次回ゲッターが呼び出されたときに、新しいivarが再度初期化されます。

于 2011-09-21T17:50:25.110 に答える
1

ドキュメントの私の解釈は、あなたが自分でそれをしない限り、あなたのオブジェクトは障害に戻されないということです(refreshObject:mergeChangesそしてドキュメントの他のいくつかのメソッド:http://developer.apple.com/library/mac/documentation/ Cocoa / Conceptual / CoreData / Articles / cdPerformance.html#// apple_ref / doc / uid / TP40003468-SW4)。また、deallocをオーバーライドしないように明示的に指示しているので、正しいことをしていると言えます。しかし、このトピックに関する他の考えを聞くことに非常に興味があります。

于 2011-09-21T17:39:48.053 に答える