我在迭代不同document
对象的循环中有以下代码:
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSData* data = [document primitiveValueForKey:@"data"];
[document.managedObjectContext refreshObject:document mergeChanges:NO];
[pool release];
“data”属性是一个大blob(1MB图像)。 当我使用分配仪器监视内存时,内存使用量正在增加。我无法找到泄漏的来源以及如何将其移除。
谢谢!
答案 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,并且您不想关闭撤消注册。