在迭代核心数据对象时遇到内存问题。随着它循环通过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];
}
答案 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];
}