Avez-vous de libérer IBOulets dans le dealloc?
Avez-vous à libération IBOulets dans le dealloc? Je ne suis pas sûr que sur ce coup parce que je n'ai pas les alloc et généralement vous ne relâchez pour quelque chose que vous avez appelé alloc sur. Quelqu'un sait?
- Dupliquer: stackoverflow.com/questions/61838/...
Vous devez vous connecter pour publier un commentaire.
Votre IBOutlets sont probablement
@properties
. Si elles le sont, et vous avezretain
comme un attribut, puis vous avez besoin de libérer dans-dealloc
En d'autres termes:
Vous aurez à
[myTable release];
dans votre dealloc.Si vous faites une nouvelle Navigation en Fonction de l'Application dans Xcode, et de regarder dans l'appdelegate.h:
et le dealloc pour appdelegate.m:
La clé de chose à voir ici sont des lignes comme celles-ci:
Si il y est une à conserver, qui signifie que la propriété est d'être "possédé" par votre code et vous devez le libérer.
Bien sûr, il existe d'autres moyens, tels que le déclarant ne pas les IBOutlets en tant que propriétés, ou les déclarant comme des propriétés de sans retenir. Je trouve que dans la plupart des cas, je préfère avoir leur être conservé propriétés, dont je puis avoir à libérer explicitement. Un exemple de cela est lorsque vous retournez à partir d'un point de vue contrôleur à l'autre. Comme l'une-vue-contrôleur est rejetée, ses vues sont supprimés et ils sont libérés. Tout IBOutlet UILabels sur ce point de vue serait libéré trop si je ne les ai pas conservés. Cela signifie que lorsque je retourne à l'ancien point de vue, je dois aller à travers et de réinitialiser mes étiquettes et les contrôles à leurs dernières valeurs, quand j'aurais pu facilement gardé sauvé si je viens de conserver la IBOutlet.
Si vous venez d'utiliser IBOutlet dans votre interface, vous N'avez PAS besoin de les libérer. La raison en est que, sauf si vous explicitement les conserver dans votre code, ils sont simplement d'être ensemble. Ils restent parce que la vue y est. Évidemment, si vous utilisez également les propriétés et les conserver, vous devez libérer sur dealloc.
Il n'est pas question de IBOutlet, c'est à propos de votre déclaration.
Si vous utilisez un assistant nouveau projet dans Xcode, vous avez probablement quelques ce type de code dans votre fichier d'en-tête.
Vous pouvez le voir, il y a conserver mot-clé dans le fichier d'en-tête. À la suite de la ligne directrice sur la gestion de la mémoire, vous DEVEZ libérer tout votre de conserver (en appelant alloc, de copie, de conserver, etc.). Et vous avez conserver dans votre code vous devez libération il.
En outre, l'assistant déjà ajouter un peu de code de libération pour vous.
Comme vous l'avez dit, vous devez libérer de tout ce que vous avez choisi vous-même (avec
alloc
oucopy
). Il fonctionne dans l'autre sens: vous ne devez pas relâcher tout de Cacao objets que vous n'avez pas l'allocation de vous-même (certains CoreFoundation fonctions allouer, et vous êtes responsable pour les libérer, mais il n'est pas le cas ici).Si vous n'avez pas à allouer votre IBOutlet, alors vous n'avez pas à le libérer, à moins bien sûr, pour une raison quelconque, vous avez conservé quelque part.
Pour répondre à la question latérale par Joe d'Andrea. Vous pouvez utiliser
self.label = nil;
. Parce que c'est l'appel de setLabel, qui est généré automatiquement:Comme vous pouvez le voir la
label
sera publié ensuitenil
est affecté à l'étiquette.Mais assurez-vous de ne pas l'écrire comme
label = nil
. Qui ne fonctionnera pas.Parce que vous devez appeler la génération automatique d'étiquette méthode d'accesseur.
Voici ce que j'ai fait à l'égard de
IBOutlet
objets (en conjonction avec une PLUME de fichier):Côté la question: est-il plus logique d'utiliser
self.label = nil
dans le dealloc, ou doitrelease
être appelé explicitement (par exemple, à maintenir l'analyseur statique heureux)?Je suppose, à ce point, nous sommes sur notre chemin de toute façon, donc il n'y a pas besoin de mettre notre IBOutlet objets à néant.
Si c'est votre BlahViewController.h:
Alors ce serait votre
dealloc
dans BlahViewController.m:Toutefois, si ce est votre BlahViewController.h:
Alors ce serait votre
dealloc
dans BlahViewController.m:Et enfin, si c'est votre BlahViewController.h:
Alors ce serait votre
dealloc
dans BlahViewController.m:En bref, si vous déclarez une propriété, avec
retain
, alors vous avez besoin pour le libérer.