Si vous suivez ce qui est maintenant considéré comme la meilleure pratique, vous devez libérer les propriétés de sortie, parce que vous auriez dû les retenus dans le accesseur set:
@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 la sémantique de gestion de la mémoire explicite et claire, et il fonctionne de manière cohérente sur toutes les plateformes pour tous les fichiers nib .
Note: Les commentaires qui suivent ne concernent que iOS avant 3.0. Avec 3.0 et versions ultérieures, vous devriez plutôt simplement nul sur la valeur des propriétés dans viewDidUnload.
Une considération ici, cependant, est quand votre contrôleur pourrait disposer de son interface utilisateur et 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 - dire sous la pression de la mémoire - le libère, avec l'espoir qu'il puisse être rechargé si la vue est à nouveau nécessaire). Dans cette situation, vous voulez vous assurer que lorsque la vue principale est disposé vous aussi renoncer à la propriété des autres points de vente afin qu'ils puissent eux aussi être désallouées. Pour UIViewController, vous pouvez régler 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 à une autre question. Parce que UIViewController met actuellement en œuvre sa dealloc
méthode en utilisant la setView:
méthode accesseur (plutôt que de libérer simplement directement la variable), self.anOutlet = nil
sera appelé dealloc
, ainsi que , en réponse à un avertissement de mémoire ... Cela conduira à un accident dans dealloc
.
Le remède est d'assurer que les variables de sortie sont également mis à nil
en dealloc
:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}