2010-08-06 7 views
0

J'ai une classe que j'ai écrite appelée Location qui contient juste quelques chaînes. J'utilise deux instances de cette classe dans un contrôleur de vue, et lorsque j'initialise les deux variables dans viewDidLoad, elles fonctionnent correctement pour cette méthode, mais lorsque j'essaie de les utiliser plus tard, elles sont nulles. Je les ai définis comme propriétés conservées. Je les ai testés et je sais qu'ils sont initialisés pour viewDidLoad (j'utilise leurs champs dans la vue). Dois-je faire quelque chose de spécial dans la classe Location pour m'assurer qu'ils ne seront pas publiés? Quand je les réinitialise dans une méthode différente, tout se passe bien.Pourquoi les variables initialisées dans viewDidLoad ne conservent-elles pas de valeur dans Objective-C?

+0

Que voulez-vous dire "plus tard"? Pouvez-vous donner un exemple concret? – jtbandes

+0

Les configurez-vous avec self.variableName = ...? Si non, faites-le. Mais même s'ils sont sortis "tôt", il est difficile de voir pourquoi ils seraient mis à zéro. Les effacez-vous dans votre méthode viewDidUnload? Parce que cela peut être appelé à tout moment lorsque votre vue n'est pas visible. – Felixyz

+0

Cela a fonctionné parce que '@property (retain)' est vraiment juste un raccourci pour les getters et setters générés. Vous avez probablement assigné un objet autoreleased à votre variable d'instance. Le définir à travers la propriété conserve sa valeur. – Justin

Répondre

1

Les variables d'instance correctement initialisées dans viewDidLoad doivent normalement conserver des valeurs comme dans n'importe quelle autre méthode. Une erreur de codage peut provoquer le problème que vous décrivez, par ex. si vous avez des variables locales dans viewDidLoad en masquant des variables d'instance nommées de manière identique.

0

Vous (ou la boucle d'événements) relâchez probablement les objets que vous initialisez après la fin de viewDidLoad car ils sont auto-libérés ou quelque chose comme ça. Pour éviter cela, rendez les propriétés des variables en question dans la classe avec l'attribut "retain" et mettez-les à nil sur dealloc.

+0

Cela ne les amènerait pas à devenir nul. – Chuck

Questions connexes