0

私はこれに関連するさまざまなことについて同様の質問を投稿しましたが、これに約1週間苦労していて、役に立たなかった。それはすべてこのコードに帰着します:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Media"
                                                          inManagedObjectContext:oldContext];
        [oldFetchRequest setEntity:oldEntryEntity];
        [oldFetchRequest setFetchBatchSize:10];
        NSArray *medias = [oldContext executeFetchRequest:oldFetchRequest error:&error];

    int i = 0;

    int count = [oldContext countForFetchRequest:oldFetchRequest error:nil];

    NSLog(@"count: %i", count);

    while (i < count) {
        @autoreleasepool {
        NSManagedObject *media = [medias objectAtIndex:i];

            [oldContext refreshObject:media mergeChanges:NO];

        NSLog(@"i: %i", i);
        i++;
        }
    }

mediaアイテムの数である約250に達するはずです。アプリがメモリを使い果たしてクラッシュする前に、実際には約100に達します。このコードが実行されるたびに、メモリがどんどん増えていきます。おそらく、それぞれmediaに大きな属性を含む多数のNSData属性が含まれているためです。Instrumentsは、コードが実行されるたびにメモリが増加することを示しています。

@autoreleasepoolそしてrefreshObject:mergeChanges:私はこの問題を解決するために追加しましたが、うまくいきませんでした。

私がやろうとしているのは、このストアのすべてのアイテムを手動で新しいストアに移動することです。これは、標準の移行では大きなデータでは機能しないためです。これが出発点です。

4

1 に答える 1

1

それぞれmediaに、 の新しいインスタンスを割り当てていますNSManagedObject。代わりに、 の 1 つのインスタンスを定義して、mediaそれを再利用できます。

NSFetchedResultsControllerまた、一連のフェッチ結果を反復処理するために最適化され、舞台裏であらゆる種類のメモリ最適化を備えた を実際に使用できると思います。

次に、次のように単純に繰り返すことができます。

for (id object in _fetchedResultsController.fetchedObjects)

これらの提案は両方とも、メモリフットプリントを大幅に削減するはずだと思います。

于 2012-09-25T16:09:17.703 に答える