2011-05-02 3 views
3

Si je crée un objet à l'intérieur d'une fonction et le retourne, quand/où devrais-je libérer cet objet? Voici un exemple où je crée un objet.Libérer l'objet renvoyé dans le bon sens?

- (NSDictionary*) sampleFunction 
{ 
    NSMutableDictionary* state = [[NSMutableDictionary alloc] initWithCapacity:5]; 

    [state setObject:[[NSNumber alloc] initWithInt:self.a] forKey:@"a"]; 
    [state setObject:[[NSNumber alloc] initWithInt:self.b] forKey:@"b"]; 
    [state setObject:[[NSNumber alloc] initWithInt:self.c] forKey:@"c"]; 

    return state; 
} 

question supplémentaire: Afin d'éviter les fuites de mémoire que je également censé libérer les NSNumbers attribués ici aussi? A quoi ressemblerait ce code sans fuites de mémoire?

Répondre

1

Tout d'abord, vous devez vous rendre à ce guide pour toutes les règles:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

... ne prennent pas ce que les gens disent ici comme parole d'évangile. Il y a quelques exceptions et des règles étranges que le guide que j'ai lié ci-dessus va clarifier. Maintenant, en ce qui concerne votre exemple: largement parlant, chaque fois que vous alloc quelque chose que vous devez le libérer. Lorsque vous renvoyez une valeur à partir d'une méthode, elle doit être autoreleased (99% du temps, il y a quelques exceptions: voyez, rien n'est facile!). Apple fournit des méthodes auto-libérées pour plus de commodité - NSNumber en a un.

Je vais vous montrer votre code ci-dessus, mais réécrite pour utiliser ces méthodes autoreleased:

- (NSDictionary*) sampleFunction 
{ 
    NSMutableDictionary* state = [NSMutableDictionary dictionaryWithCapacity:5]; 

    [state setObject:[NSNumber numberWithInt:self.a] forKey:@"a"]; 
    [state setObject:[NSNumber numberWithInt:self.b] forKey:@"b"]; 
    [state setObject:[NSNumber numberWithInt:self.c] forKey:@"c"]; 

    return state; 
} 

Comme je l'ai mentionné, vous pouvez également utiliser autorelease avec alloc/init:

NSMutableDictionary* state = [[[NSMutableDictionary alloc] initWithCapacity:5]autorelease]; 

Encore une fois , le document Apple que j'ai lié à ci-dessus est le meilleur endroit où aller pour les réponses aux questions de gestion de la mémoire.

+0

C'était très utile, merci. – Mark

Questions connexes