我正在使用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”上设置了一个中断,并且没有被击中。

最佳答案

将其更改为:

- (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会使该代码对于多对多关系更容易阅读。

08-27 23:10