私はこの問題に何週間も取り組んできましたが、解決できないようです。アクションを実行するために、データベース内のすべてのエンティティを反復処理しています。しばらく NSFetchRequest を使用していましたが、停止しようとしたにもかかわらず、反復ごとにメモリ使用量が増加し続け、反復ごとにメモリが戻ってこなかったようです。現在、同じタスクに NSFetchedResultsController を使用しています。
これは私が持っているコードです:
NSFetchedResultsController:
- (NSFetchedResultsController *)updateController {
if (_updateController != nil) {
return _updateController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:10];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil
cacheName:nil];
self.updateController = theFetchedResultsController;
return _updateController;
}
そして、それが実行されるコード:
NSLog(@"update controller: %@", [self updateController]);
if (![[self updateController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
int i = 0;
id sectionInfo = [[_updateController sections] objectAtIndex:0];
NSLog(@"count: %i", [sectionInfo numberOfObjects]);
NSManagedObject *entry;
while (i < [sectionInfo numberOfObjects]) {
@autoreleasepool {
entry = [_updateController.fetchedObjects objectAtIndex:i];
NSLog(@"entry: %@", [entry valueForKey:@"message"]);
NSLog(@"context 1: %@", [entry managedObjectContext]);
NSLog(@"context 2: %@", [[self updateController] managedObjectContext]);
[[entry managedObjectContext] refreshObject:entry mergeChanges:NO];
NSLog(@"i: %i", i);
i++;
}
}
楽器はこれを示しています:
タイムラインでその期間をクリックすると、表示されているテーブルのエントリが選択されます。タスクを実行しているグラフの期間、データ使用量は 1.14mb から 1.17mb にわずかに増加しています。この段階ではそれほど多くはありませんが、NSData 画像などのより大きなデータを処理するコードを追加すると、アプリのデータ使用量が増加し、最終的にメモリが不足してクラッシュすることになります。アプリの 1.0 バージョンは既にアプリ ストアにあるため、コア データに NSData を含めないという選択肢はありません。
誰かが助けてくれることを願っています、ありがとう。