CoreData内存管理问题

时间:2009-07-28 00:23:50

标签: iphone cocoa xcode core-data

我正在使用Coredata,并且数据模型具有以下与多种关系:

  

Rooms.isUsedBy - >很多班级都使用一间房间   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”上设置了休息时间并且没有被击中。

2 个答案:

答案 0 :(得分: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才能让代码更易于阅读以达到那种多对多关系。

答案 1 :(得分:0)

您应该可以使用键值编码来完成此操作。例如:

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

有关详情,请参阅documentation