读取属性时CoreData泄漏

时间:2010-12-27 14:37:22

标签: objective-c ios core-data memory-management memory-leaks

我在迭代不同document对象的循环中有以下代码:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSData* data = [document primitiveValueForKey:@"data"];
[document.managedObjectContext refreshObject:document mergeChanges:NO];
[pool release];

“data”属性是一个大blob(1MB图像)。 当我使用分配仪器监视内存时,内存使用量正在增加。我无法找到泄漏的来源以及如何将其移除。

谢谢!

4 个答案:

答案 0 :(得分:0)

您的示例代码出了问题,您的意思是:

NSData *data = [document primitiveValueForKey:@"data"]; 

由于数据目前未在自动释放池的范围内分配,因此也不会与您的自动释放池一起发布

为什么使用primitiveValueForKey而不是动态访问器?

  

动态访问器更多   高效,并允许编译时   检查。

答案 1 :(得分:0)

如何调用[pool drain]代替[pool release]

答案 2 :(得分:0)

我设法通过在排空池之前执行:[document.managedObjectContext processPendingChanges]来解决问题。但是,我不明白有哪些待处理的更改?有人可以启发我吗?

答案 3 :(得分:0)

processPendingChanges似乎解决问题的观察结果告诉我,在您导入时,NSManagedObjectContext的UndoManager会跟踪您在批量导入时所做的所有更改。

processPendingChanges正在做什么(据我所知)正在将存储在managedObjectContext中的更改推送到持久存储。

尝试[[document managedObjectContext] setUndoManager:nil](或者为导入创建新的managedObjectContext,并将其undoManager设置为nil,如果document.managedObjectContext是'main'editObjectContext,并且您不想关闭撤消注册。