2011-04-13 3 views
1

Lorsqu'une méthode retourne un objet provenant de et NSMutableArray, l'objet doit-il être auto-libéré? Vérifiez la méthode suivante. Devrais-je également autoriser la valeur zéro?Objet autoreleasing retourné par NSMutableArray

-(NSObject*)getElementByID:(NSString*)ID{ 

    for(int i=0;i<[elements count];i++){ 
     NSObject *element = (NSObject*) [elements objectAtIndex:i]; 

     if([element.key isEqualToString:ID]){ 
      return [element autorelease]; 
     } 
    } 

    return nil; 
} 

Répondre

3

Vous ne devez pas autoriser la libération element car vous n'en êtes pas le propriétaire (vous n'avez pas conservé de clause de retenue). Vous en seriez devenu propriétaire si vous l'avez acquis en utilisant alloc, new ou retain. Depuis que vous avez acquis cet objet en appelant le objectAtIndex:, vous ne le possédez pas. Voir Three Magic Words. Appeler autorelease ici provoquera un plantage plus tard pour sur-relâcher.

Le nom de votre méthode est incorrect et interrompt KVC. Une méthode qui commence par get doit prendre un pointeur qui sera mis à jour avec le résultat. Cela devrait être elementForID:. Comme indiqué ci-dessus avec les trois mots magiques, nommer dans ObjC est très important pour écrire le code stable

En note, il est classique d'utiliser id est la plupart des cas plutôt que NSObject*. Ils signifient des choses légèrement différentes, mais généralement id est correcte.

+0

Merci. Cela a beaucoup aidé. – Cyprian

0

Vous n'avez jamais besoin de faire des choses liées à la gestion de la mémoire à nil. Donc, non, vous ne devriez pas envoyer autorelease à nil.

Vous ne devriez pas non plus besoin d'envoyer autorelease à l'objet element que vous retournez de votre baie elements. Cet objet que vous retournez restera en mémoire en vertu de elements lui-même l'ayant conservé. Si la méthode appelante souhaite retain la valeur que vous renvoyez, il peut le faire. Mais si cette méthode d'appel n'utilise que la valeur retournée dans sa propre portée, il est sûr de le faire sans le conserver.

Questions connexes