内存增加每个核心数据迭代

时间:2013-05-14 00:11:58

标签: ios objective-c cocoa-touch core-data nsfetchedresultscontroller

在迭代核心数据对象时遇到内存问题。随着它循环通过CFData(存储)不断增加,直到应用程序崩溃。每次循环结束后核心数据都不应释放内存吗?

for (Patient *patient in self.fetchedResultsController.fetchedObjects) {
    for (Exam *examForPatient in patient.exams) {
        //do stuff with examForPatient
    }
}

编辑 - 尝试以下操作并仍以相同的方式行事:

for (Patient *patient in self.fetchedResultsController.fetchedObjects) {
    for (Exam *examForPatient in patient.exams) {
        NSLog(@"%@", [examForPatient.examDate description]);

        [self.fetchedResultsController.managedObjectContext refreshObject:examForPatient mergeChanges:NO];
    }
    [self.fetchedResultsController.managedObjectContext refreshObject:patient mergeChanges:NO];
}

2 个答案:

答案 0 :(得分:1)

当您不再需要某个项目驻留在内存中时,您可以刷新它 来自文档:
“如果迭代大量对象,则可能需要使用本地自动释放池块来确保尽快释放临时对象”

修改:请参阅@lnafziger回答

注意:如果要更新患者对象或检查对象,则无法刷新它,因为您将对其进行所有更改(如果使用mergeChanges:YES,则不会释放其内存)。然后,您需要定期保存并刷新不再需要的对象。

See here了解更多信息。

答案 1 :(得分:0)

每当您访问托管对象时,它都会触发故障并从商店加载完整对象。在你明确告诉它之前,它不会释放内存。将您的代码更改为:

for (Patient *patient in self.fetchedResultsController.fetchedObjects) {
    for (Exam *examForPatient in patient.exams) {
        //do stuff with examForPatient

        // Then release the memory.  As below, save first if needed.
        [yourManagedObjectContext refreshObject:examForPatient mergeChanges:NO];
    }

    // Then release the memory - save patient first if you have made changes to it.
    [yourManagedObjectContext refreshObject:patient mergeChanges:NO];
}