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