-1

重複の可能性:
コア データのすべての項目に対してタスクを実行するときにメモリ不足を回避するにはどうすればよいですか?

似たようなタイトルのこちらを投稿しましたが、別件です。同じ質問で2つの質問をする際の混乱を避けるために、これを別々に投稿しました.

私がやりたいことは、メモリを使い果たすことなく、コア データ ストアに大量のデータを追加することです。ここに私が現在持っているコードがあります:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entry"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(version == %@)", @"1.0"];

[request setPredicate:predicate];

NSArray *results = [[AppDelegate applicationDelegate].managedObjectContext executeFetchRequest:request error:nil];

int i = 0;

while (i < results.count) {

    Entry *entry = [results objectAtIndex:i];

    entry.version = @"1.1";

    Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
                                             inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext];

    entry.version = existingEntry.version;

    [[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry];

    i++;
}

しかし、これは一定量のデータを通過した後、メモリが不足します。これは、最初の「結果」のみを取得し、配列全体を処理しない場合にも発生するため、メモリ不足は結果を処理した結果ではないようです。

メモリを使い果たすことなくこれを行うにはどうすればよいですか?

4

1 に答える 1

2

あなたの数が1000であると仮定します-いくつかの大きな数。それを100のような小さなものに分割します。次に、大きなループで別のカウンターを設定し、小さなループの周りに自動解放プールを使用します。これにより、その内側のループを離れるとプールが排出されます。これは、内側のループ内のオブジェクトへの強い参照がないことを前提として機能します(ただし、その場合でも役立つ可能性があります)。

編集:コード(テストまたはコンパイルされていません)

int total = results.count;
while (total) {
    int count = total < 100 ? total : 100;
    total -= count;

    @autoreleasepool {
        while(count--) {
                Entry *entry = [results objectAtIndex:i];

                entry.version = @"1.1";

                Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
                                                         inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext];

                entry.version = existingEntry.version;

                [[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry];

            }
        }
}
于 2012-09-16T17:26:58.367 に答える