更新NSManagedObjectContext时CFString内存泄漏

时间:2014-04-27 06:27:11

标签: ios core-data ios7 memory-leaks instruments

每分钟我都会使用核心数据运行对sqlite数据库的更新,通过发出Web请求,解析该请求以及更新托管对象上下文中的对象。 从Web服务器返回的JSON数据存储在NSDictionary:

NSDictionary* dictionary = [NSJSONSerialization JSONObjectWithData:operation.data options:kNilOptions error:&error];

我使用存储为成员的字典初始化NSOperation实例。该操作循环遍历字典并更新NSManagedObjectContext,例如:

    for (NSDictionary *item in self.dictionary) {
          NSManagedObject *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.context];
          [newItem setValue:item[@"customerName"] forKey:@"contact_firstname"];
    }
    [self.context save:&error];

查看“仪器”面板,我发现每次更新都会留下很少未发布的CFString对象:

enter image description here

已发布和未发布的CFS字符串之间的差异可以通过每个的refcount跟踪显示:

发行日期 enter image description here

未发行: enter image description here

[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__]所做的保留(+1)会阻止此对象被释放。由于每次更新我都会从MSManagedObjectContext中删除所有对象,因此我没有看到为什么不应该释放这些CFStrings的原因。

_newAllPropertiesWithRelationshipFaultsIntact__的目的是什么,为什么它会保留我的一些CFS字符串?

1 个答案:

答案 0 :(得分:0)

即使您致电NSManagedObjectContext

save:也会对其管理的所有对象进行所有更改。这可能是此问题,以确定您在致电reset后可以致电save:reset只会删除自CoreData DB启动以来对moc所做的所有未保存更改。

[self.context save:&error];
[self.context reset];