2010-07-22 11 views
0

Très bien, c'est une question élémentaire mais je demande parce que je ne comprends pas honnêtement comment gérer correctement cela. Si je décommente les deux dernières lignes, ce code se bloque, même si je ne pense pas qu'il devrait le faire.Libération de l'objet correct Memory/Obj-C. Lequel de ceux-ci exige la libération?

Le code suivant provient d'un UILabel sous-classé personnalisé dans lequel j'ai ajouté la méthode suivante, setTextFromFloat.

-(void)setTextFromFloat:(float)newValue { 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode:NSNumberFormatterRoundUp]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:newValue]]; 
NSString *newLabelValue = [numberString stringByAppendingString:@"x"]; 
self.text = newLabelValue; 
//[numberString release]; 
//[formatter release]; 
} 

Donc, il y a trois objet ici que je suis confus au sujet de:

a) self.text (l'ancienne valeur de chaîne) - Lorsque cela est libéré? Devrais-je libérer l'ancien contenu de self.text lorsque j'appelle cette fonction?

b) formatter, le NSNumberFormatter j'alloc'd ici a besoin presque certainement la libération

c) Qu'en est-numberString? Je l'utilise juste comme un intermédiaire pour construire newLabelValue. si je le libère, je crois que le programme se bloque, mais pourquoi? Ne suis-je pas responsable de la mémoire utilisée indirectement en appelant stringFromNumber?

Toute sagesse grandement appréciée, merci!

+0

Je vous recommande fortement de faire un "Build and Analyze" dans le menu Build. Il mettra en évidence exactement ce que vous êtes en train de relâcher ou de relâcher. – BarrettJ

Répondre

0

numberString ne doit pas être libéré. Vous l'obtenez à travers un constructeur de commodité, donc c'est auto-libéré. À propos de votre propriété self.text, si vous ne l'avez pas déclarée, vous n'êtes pas responsable. Sinon, il doit être libéré dans la méthode dealloc.

1

Libérez uniquement le formateur à la fin de votre méthode setTextFromFloat:.

Parce que votre classe hérite de UILabel, self.text est une partie de la classe UILabel et sera publié dans la méthode de deallocUILabel, de sorte que vous n'avez pas à libérer vous-même si la méthode dealloc de votre sous-classe que vous appelez [super dealloc].

numberString est en cours de création en utilisant NSString.stringFromNumber:, donc il est déjà configuré pour la libération automatique à partir de la méthode interne. Ne le relâchez pas manuellement, sinon votre programme tombera en panne.

1

Donc, il y a trois objet ici que je suis confus au sujet de:

a) self.text (l'ancienne valeur de chaîne) - Lorsque cela est libéré? Devrais-je libérer l'ancien contenu de self.text lorsque j'appelle cette fonction?

self.text est pas un objet, il est une propriété, ce qui signifie qu'il est la paire de accesseurs -text et -setText: Si elle a une instance soutien variables et il a conserver ou copier la sémantique, vous devez libérer la variable d'instance dans -dealloc.

b) formatter, le NSNumberFormatter j'alloc'd ici a besoin presque certainement la libération

Non "presque certainement" mais "certainement".

c) qu'en est-il de numberString? Je l'utilise juste comme un intermédiaire pour construire newLabelValue. si je le libère, je crois que le programme se bloque, mais pourquoi? Ne suis-je pas responsable de la mémoire utilisée indirectement en appelant stringFromNumber?

Passez en revue le Cocoa Memory Management rules. Avez-vous obtenu numberString par new, alloc ou une méthode contenant une copie? Non, tu ne l'as pas fait. L'avez-vous conservé? Non, tu ne l'as pas fait. Par conséquent, vous ne devez pas le libérer parce que vous ne le possédez pas. Si vous voulez le posséder, envoyez-lui -retain. Ensuite, vous devez le relâcher lorsque vous n'avez plus besoin de le garder.