2009-07-28 5 views
0

J'utilise CoreData et un modèle de données avec les relations ToMany suivantes:CoreData problème de gestion de la mémoire

Rooms.isUsedBy -> Classe de nombreuses classes utilisent une salle
Class.hasStudents -> Étudiants de nombreux étudiants sont dans une classe

Compte tenu de la salle que je veux obtenir tous les étudiants qui utilisent la salle. Voici le code simplifié:

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

roomStudents est calculé correctement.
Cependant, en quittant la méthode, j'obtiens une erreur "EXC_BAD_ACCESS". Je suis debuggin cela dans le simulateur de l'iPhone.

Je suis presque sûr que je fais/ne fais pas quelque chose correctement avec la gestion de la mémoire. J'ai un break sur "malloc_error_break" et il n'est pas touché.

+0

Est-ce que roomStudenta est un NSManagedObject? – Daniel

+0

O ne vous méprenez pas le bloc de code est confus essayez d'utiliser la fonction de codeblock d'insertion – Daniel

Répondre

1

changement à quelque chose comme:

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

Le setByAddingObjectsFromSet: méthode retourne un objet NSSet libéré automatiquement, de sorte que vous ne voulez pas libérer vous-même. Vous obtenez le EXC_BAD_ACCESS lorsque le pool autorelease est drainé et l'objet que vous avez déjà publié est libéré une deuxième fois. Juste comme une note de côté, le nom hasStudents semble confus, il semble que ce serait un booléen - je pense que juste students rendrait le code plus facile à lire pour cette relation to-many.

+0

La première fois que l'utilisateur, la prochaine fois utilisera la fonctionnalité de bloc de code, merci pour l'aide. hasStudents vient de diagrammes de relation d'entité et est assez commun dans ce monde. –

0

Vous devriez pouvoir le faire avec le codage Key-Value. Par exemple:

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

Voir la documentation plus.

+0

À mon humble avis, c'est une meilleure réponse que la première si elles fonctionnent toutes les deux. Un problème mineur que le code devrait être: [aRoom valueForKeyPath: @ "isUsedBy. @ DistinctUnionOfSets.hasStudents"]; –

Questions connexes