我正在使用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”上设置了休息时间并且没有被击中。
答案 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。