2009-07-28 13 views
0

私はCoredataを使用して、次のtoMany関係でデータモデルを持っている: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 Simulatorでこれをデバッグしています。

私はメモリ管理で何か正しくやっていないことを確信しています。 "malloc_error_break"にブレークが設定されていて、ヒットしていません。

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

setByAddingObjectsFromSet::のようなものに

+0

roomStudentaはNSManagedObjectですか? – Daniel

+0

Oコードブロックが紛らわしいのは、コードブロックの挿入機能を使用してみてください。 – Daniel

答えて

1

変更、それをあなたがそれを自分を解放したくないので、この方法は、自動解放NSSetオブジェクトを返します。自動解放プールが排水され、既にリリースされたオブジェクトがもう一度リリースされると、EXC_BAD_ACCESSが表示されます。

hasStudentsという名前は混乱しているようですが、ブール値であるように聞こえます。studentsは多対多関係のコードを読みやすくします。

+0

初めてのユーザーの場合、次回はコードブロック機能を使用します。 hasStudentsはエンティティ関係図から来て、その世界ではかなり一般的です。 –

0

キー値コーディングでこれを行うことができます。たとえば:

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

は、より多くのためにdocumentationを参照してください。

+0

IMHOこれは両方とも機能しますが、最初の方が良い答えです。 1つのマイナーな問題がコードでなければなりません: [aRoom valueForKeyPath:@ "isUsedBy。@ distinctUnionOfSets.hasStudents"]; –

関連する問題