【问题标题】:CoreData Memory management issueCoreData 内存管理问题
【发布时间】:2009-07-28 00:23:49
【问题描述】:

我正在使用 Coredata 并且有一个具有以下 toMany 关系的数据模型:

Rooms.isUsedBy -> 类很多类都使用一个 Room
Class.hasStudents -> 一个班级中有很多学生的学生

给定房间,我想获取所有使用该房间的学生。 这是简化的代码:

-(void) studentsinRoom:(Room*)aRoom {
    NSSet* roomStudents = [[NSSet alloc]init];
    for (SchoolClass* aClass in aRoom.isUsedBy) {
        roomStudents = [roomStudents setByAddingObjectsFromSet:aClass.hasStudents];
    }
    [roomStudents release];
}

roomStudents 计算正确。
但是,当退出该方法时,我收到“EXC_BAD_ACCESS”错误。

我正在 iPhone 模拟器中调试它。

我很确定我在做/没有做正确的内存管理。 我确实在“malloc_error_break”上设置了一个中断并且它没有被击中。

【问题讨论】:

  • roomStudenta 是 NSManagedObject 吗?
  • 不要介意代码块令人困惑尝试使用插入代码块功能

标签: iphone cocoa xcode core-data


【解决方案1】:

将其更改为:

- (void) studentsinRoom:(Room*)aRoom
{
    NSSet* roomStudents = nil;
    for (SchoolClass* aClass in aRoom.isUsedBy)
    {
        roomStudents = [roomStudents setByAddingObjectsFromSet:aClass.hasStudents];
    } 
}

setByAddingObjectsFromSet: 方法返回一个自动释放的 NSSet 对象,所以你不想自己释放它。当自动释放池耗尽并且您已经释放的对象被第二次释放时,您将获得EXC_BAD_ACCESS

顺便说一句,hasStudents 的名称似乎令人困惑,它听起来像是一个布尔值 - 我认为只需 students 就可以让代码更容易阅读这种对多关系。

【讨论】:

  • 第一次使用,下次会使用代码块功能,感谢帮助。 hasStudents 来自实体关系图,在那个世界里很常见。
【解决方案2】:

您应该能够使用键值编码来做到这一点。例如:

roomStudents = [aRoom valueForKeyPath:@"@distinctUnionOfSets.isUsedBy.hasStudents"];

请参阅documentation 了解更多信息。

【讨论】:

  • 恕我直言,这是一个比第一个更好的答案,尽管它们都有效。代码的一个小问题应该是:[aRoom valueForKeyPath:@"isUsedBy.@distinctUnionOfSets.hasStudents"];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2011-01-07
相关资源
最近更新 更多