2010-09-07 2 views
0

Comment libérer la mémoire dans cette situation? Dois tu?objectif c gestion de la mémoire

- (NSString *) whatHappensHere { 
NSMutableString * mutableString = [[NSMutableString alloc] initWithString:@"Hello"]; 
    // .... 
     // more code ... 
     // ... 
return mutableString; 
} 

Répondre

3

Avec autolibération

- (NSString *) whatHappensHere { 
NSMutableString * mutableString = [[NSMutableString alloc] initWithString:@"Hello"]; 

[mutableString autorelease]; 
return mutableString; 
} 
+1

Sinon, allouent, initialiser et AutoRelease tous sur la une ligne; alors vous pouvez [plus facilement] avoir plusieurs déclarations de retour si vous devez quitter prématurément. – dreamlax

+1

Une alternative encore meilleure ne serait-elle pas de le réécrire comme ceci: 'NSMutableString * mutableString = [NSMutableString stringWithString: @" Bonjour "];' puisque cela s'occupe des trois avec un seul message? – jlehr

+0

Cela fonctionne aussi bien. Lorsque vous apprenez, il peut être bon d'être explicite avec votre gestion de la mémoire si – willcodejavaforfood

0

Comme willcodejavaforfood dit, la convention est que tout objet nouvellement allouée est retourné à partir d'une méthode devrait être autorelease « d avant d'être renvoyé. Cela indique à l'exécution Objective-C que si personne n'en prend possession avec retain avant (dans la plupart des cas) l'itération en cours de la boucle d'événement d'application se termine, elle doit être libérée.

S'il est simplement utilisé localement dans la fonction appelante ou renvoyé dans la pile, cela fonctionne très bien et il est libéré tôt ou tard. Si quelqu'un finit par vouloir le garder, alors il doit le faire et il saura donc qu'il doit le faire lui-même plus tard.

(En fait, la plupart des constructeurs non init* utilitaires pour les classes de base ObjC comme les chaînes, etc, réussissent à le faire, ou au moins quelque chose fonctionnellement équivalent.)