0

私はこれに間違ってアクセスしている可能性があると思います.おそらく誰かが私を正しい方向に向けることができます.

Entryエンティティと 1 対多の関係を持つエンティティがありMediaます。Media エンティティには、 というデータ属性が含まれていますoriginalImage

これが繰り返される最初の 50 個のエンティティには、セットに項目がEntryありません。mediaその後、originalImage属性にアクセスするにつれて速度が低下し、最終的にメモリ不足になり、NSLog の以前のメモリ警告以外のメッセージなしでホーム画面に戻ります。これをInstrumentsで実行すると、この時点でメモリが不足していることも示されます。これが私のコードです:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
                                                          inManagedObjectContext:oldMOC];
[oldFetchRequest setEntity:oldEntryEntity];
[oldFetchRequest setFetchBatchSize:10];
NSArray *entrys = [oldMOC executeFetchRequest:oldFetchRequest error:nil];

for (NSInteger index = 0; index < entrys.count; ++index) {

    Entry *entry = [entrys objectAtIndex:index];

    NSOrderedSet *oldMediaSet = [entry valueForKey:@"media"];

    for (Media *media in oldMediaSet) {

        @autorelease {

            [media valueForKey:@"originalImage"];    

        }

    }

}

その originalImage 行を削除すると、クラッシュしないことを意味します。これが、アクセスされていることに関連していると思わせる理由です。おそらく、orderedSet を取得する方法は、これらのアイテムがメモリに残ることを意味するのでしょうか?

4

2 に答える 2

1

Core Data は、利用可能なメモリがいっぱいになるまで、アクセスしているプロパティの障害を処理しています。これを防御しようとして@autoreleaseいますが、自動解放されたインスタンスではなく、オブジェクト グラフ内の別のオブジェクトを取得しているため、それだけでは十分ではありません。何をしようとしているのかを知らなければ、問題を解決する方法を言うのは困難です。メモリが不足するまでループで同期的に反復しているため、メモリ警告がこのプロセスを中断することはありません。

于 2012-09-23T05:32:26.087 に答える
0

したがって、あるエンティティから別のMOCの新しいエンティティにデータを移動しようとするループがある場合は、古いエンティティを取得し、データを新しいエンティティに割り当てます(コピーしないでください。問題はさらに悪化します)、次に「refreshObject:mergeChanges:」を使用して古いオブジェクトと新しいオブジェクトに障害を発生させます。私はこれがうまくいくと信じていますが、私自身はそれを試していません(SQLiteストアを想定しています)。

Core Dataプログラミングガイドの「メモリオーバーヘッドの削減」(PDFの148ページ)には他にも提案があります。

于 2012-09-23T14:47:22.937 に答える