1

NSFetchRequestを実行して、管理対象オブジェクト(具体的にはXMPPUserCoreDataStorageObjects)の配列を取得するメソッドがあります。配列がperformUserFetchによって返される前にオブジェクトは正しくフォールトし、すべてのdisplayNamesを出力できますが、配列をprintUserInfoに返すと、オブジェクトはフォールト状態になります。これは、CoreDataがもたらさないことを除いて問題にはなりません。それらを取り戻します!

- (NSArray*)performUserFetch 
{
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:[xmppRosterStorage persistentStoreCoordinator]];
    [context setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:context];

    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
    NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *err;

    NSArray *result = [context executeFetchRequest:fetchRequest error:&err];
    return result;

}

- (void)printUserInfo 
{
    NSArray *result = [self performUserFetch];
    for(XMPPUserCoreDataStorageObject *user in result)
    {
        NSString *dn = user.displayName;
        NSLog(@"Display name = %@", dn);
    }
        NSLog(@"%@",result);
}

私は5秒ごとにprintUserInfoを呼び出し、performUserFetchで問題がなければ結果配列を呼び出しますが、printUserInfoですべてがポットに入れられ、配列内のすべての要素がメモリから削除されました。それは問題ありませんが、user.displayNameを呼び出すと、障害が解決されないため、dnの値はnullになり、ユーザーの説明は次のようになります。

"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)"

誰か助けてもらえますか?

(情報:10.7 SDK、printUserInfoは5秒ごとに呼び出され、ARCで実行されます)

4

2 に答える 2

5

推測するだけです。次のことを試すことは有望です

  1. 毎回管理オブジェクト コンテキストを再作成しないでください。クラスのプロパティとして保持します。
  2. メモリが割り当てられたままになるように、配列を割り当て/初期化する必要があるかもしれません。プロパティを使用することもできます。

別の解決策、ところで、を使用することNSFetchedResultsControllerです。フォルトに関しては、特に信頼性が高く効率的であるように設計されています。

于 2012-02-08T21:42:25.127 に答える
2

管理対象オブジェクトは、そのコンテキストを自動的に保持しません。範囲に-performUserFetch戻ってcontext範囲外になると、管理対象オブジェクト コンテキストはガベージ コレクションされます。コンテキストがなければ、管理対象オブジェクト自体は役に立ちません。

XMPPUserCoreDataStorageObjectこれらのインスタンスを使用する必要がある限り、(Mundi も提案したように) どこかにコンテキストを保持してください。

于 2012-02-09T03:15:37.100 に答える