2

遍历我的核心数据对象时出现内存问题。当它循环通过 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];
}
4

2 回答 2

1

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

编辑:见@lnafziger 答案

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

请参阅此处了解更多信息。

于 2013-05-14T01:21:24.303 回答
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];
}
于 2013-05-14T01:06:09.060 回答