2010-03-12 3 views
14

Je me demandais si j'avais besoin de sortir un NSObject copié? Par exemple, je crée un seul dictionnaire que je copie dans un tableau:Ai-je besoin de libérer un NSObjects copié - Objective-c

code:

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

Dois-je libérer le dictionnaire? Si oui quand?

Merci

+0

+1 bonne question – andy

+3

En règle générale, dans Cocoa vous devez libérer tout ce que vous possédez. Vous possédez quelque chose si vous l'avez envoyé par message texte, copié, alloué ou conservé. Si vous n'avez pas appelé l'une de ces méthodes, vous ne la possédez pas et vous ne devriez pas la libérer. –

Répondre

24

Oui, vous le faites. Dans ce cas, vous devriez probablement libérer la copie immédiatement après l'avoir ajouté au tableau, car le tableau conserve rien ajouté à ce:

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

Merci pour l'info! – ncohen

4

Ce fragment de documentation:

- (id) copier

Valeur de retour Objet renvoyé par la méthode de protocole NSCopying copyWithZone :, où la zone est nulle.

Discussion Cette méthode est pratique pour les classes qui adoptent le protocole NSCopying. Une exception est levée s'il n'y a pas d'implémentation pour copyWithZone :. NSObject ne prend pas lui-même en charge le protocole NSCopying. Les sous-classes doivent supporter le protocole et implémenter la méthode copyWithZone: Une version de sous-classe de la méthode copyWithZone: doit envoyer le message à super en premier, pour incorporer son implémentation, sauf si la sous-classe descend directement de NSObject.

Considérations particulières Si vous utilisez de la mémoire gérée (et non une récupération de place), cette méthode conserve le nouvel objet avant de le renvoyer. L'invocateur de la méthode, cependant, est responsable de la libération de l'objet retourné.

2

Avec copy, vous devenez propriétaire de l'objet retourné. Les conteneurs prennent également possession des objets qui leur sont ajoutés. En conséquence, vous devez renoncer à la propriété de la copie comme l'a souligné Noah. Les Cocoa memory management guidelines contiennent une section notant how to work with containers.

0

Il est difficile à dire, sans voir où vous créez un dictionnaire, si cela est raisonnable de toute façon. S'il n'y a pas d'autres membres dans le dictionnaire, il serait plus simple (mais sans doute plus difficile à lire :) faire quelque chose comme

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 

thats va vous donner de véritables objets NSDictionary dans votre tableau, plutôt que le NSMutableDictionary copies que vous créez.

+0

Pour quels motifs prétendez-vous qu'une copie d'un NSMutableDictionary ne serait pas un "* real * NSDictionary"? –

+0

Sous prétexte qu'un * real * NSDictionary relèvera des erreurs si vous essayez d'y insérer des objets. – Jeff