【问题标题】:CoreData leak when reading a property读取属性时CoreData泄漏
【发布时间】:2011-05-31 04:13:56
【问题描述】:

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

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

“数据”属性是一个大块(1MB 图像)。 当我使用分配仪器监控内存时,内存使用量正在增加。我找不到泄漏的来源以及如何消除它。

谢谢!

【问题讨论】:

  • 我没有看到 data 分配到任何地方。
  • 好点。 @Kamchatka,您正在获取键 data 的值,但没有将其设置为任何值。
  • 我想从 CoreData 读取数据的值并将其转储到文件中。这就是为什么我没有为它分配任何价值。
  • 对不起,我的代码不正确。我在复制粘贴时清理了它并忘记了分配。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你说得对,我改了代码。我的实际代码对“数据”进行了分配。我没有使用动态访问器,因为我正在进行迁移。在迁移过程中,动态访问器也会从我正在写入的文件中读取“数据”。但是在迁移过程中,“数据”的来源是旧CoreData Sqlite数据库中的数据字段。
【解决方案2】:

打电话给[pool drain]而不是[pool release]怎么样?

【讨论】:

  • 这有什么帮助?他们在 iOS 上没有类似的行为吗?
  • 对不起,错过了关于非 gc 环境的部分。无视我的回答(或投反对票)。
【解决方案3】:

我设法解决了这个问题:[document.managedObjectContext processPendingChanges] 就在排干游泳池之前。但是,我不明白会有哪些待定更改?有人能告诉我吗?

【讨论】:

  • 可能是因为你设置了mergeChanges的flag,设置为NO会产生一个新的fault,访问的时候会创建一个新的对象。
【解决方案4】:

您观察到processPendingChanges 似乎可以解决问题向我表明,在您导入时,您的 NSManagedObjectContext 的 UndoManager 会跟踪您在批量导入时所做的所有更改。

processPendingChanges 正在做的事情(据我了解)是将存储在 managedObjectContext 中的更改推送到持久存储。

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

【讨论】:

  • 我已经将 undoManager 设置为 nil。此外,这是在 iPhone 上,我认为默认情况下 undoManager 为 nil。
猜你喜欢
  • 2011-06-14
  • 2016-09-23
  • 2011-02-21
  • 2011-09-18
  • 2017-01-24
  • 2012-11-19
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多