Si vous suivez ce qui est désormais considéré comme la meilleure pratique, vous devriez libérer les propriétés de sortie, car vous auriez dû les conserver dans le mutateur de définition :
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
L'avantage de cette approche est qu'elle rend les sémantiques de gestion de mémoire explicites et claires, et elle fonctionne de manière cohérente sur toutes les plateformes pour tous les fichiers nib.
Remarque : Les commentaires suivants s'appliquent uniquement à iOS antérieur à la version 3.0. À partir de la version 3.0, vous devez simplement annuler les valeurs des propriétés dans viewDidUnload.
Une considération ici, cependant, concerne le moment où votre contrôleur peut se débarrasser de son interface utilisateur et la recharger dynamiquement à la demande (par exemple, si vous avez un contrôleur de vue qui charge une vue à partir d'un fichier nib, mais sur demande -- disons en cas de pression sur la mémoire -- la libère, en espérant qu'elle puisse être rechargée si la vue est à nouveau nécessaire). Dans cette situation, vous voulez vous assurer que lorsque la vue principale est détruite, vous abandonnez également la propriété de toute autre connexion afin qu'elles puissent également être désallouées. Pour UIViewController, vous pouvez gérer ce problème en remplaçant setView:
comme suit :
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
Malheureusement, cela donne lieu à un autre problème. Parce que UIViewController implémente actuellement sa méthode dealloc
en utilisant la méthode d'accès setView:
(plutôt que de simplement libérer directement la variable), self.anOutlet = nil
sera appelé dans dealloc
ainsi qu'en réponse à un avertissement de mémoire... Cela entraînera un plantage dans dealloc
.
Le remède est de s'assurer que les variables de sortie sont également définies sur nil
dans dealloc
:
- (void)dealloc {
// libérer les sorties et définir les variables sur nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}