Quelque part, je lisais que - en ce qui concerne les avertissements peu de mémoire et de renoncer à une vue non visible avec toutes ses sous-vues (= une pointe tout, je pense), vous devriez le faire:Pourquoi devrais-je écrire [version anView], anView = nil; plutôt que [version anView] ;?
-(void)dealloc {
[anView release], anView = nil;
[someImageView release], someImageView = nil;
[super dealloc];
}
plutôt que
-(void)dealloc {
[anView release];
[someImageView release];
[super dealloc];
}
Quelle est la raison de la mise à la terre de ces pointeurs sur nil (= "aucun objet"), après avoir appelé la libération? Laissez-moi deviner: Une autre méthode aurait pu «conserver» la vue pour une raison quelconque (n'importe quel exemple pour quand cela pourrait arriver?), Alors la chose didReceiveMemoryWarning arrive, et vous libérez une vue nib + entière qui n'est pas visible (ie dans une application multiview). Dès que l'utilisateur veut à nouveau voir cette vue, vous chargez rapidement la plume et ensuite: Il charge toutes les vues, connecte les prises, et BANG! Vos autres vues conservées sont suspendues maintenant sans aucun pointeur quelque part dans la brique de la mémoire, causant une fuite de mémoire importante et profonde jusqu'à ce que votre application tombe en panne.
Droit/Incorrect?
Non. Ceci est * explicitement * interdit par Apple, et un bon moyen de provoquer un crash dans certaines circonstances. Voir http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc –
Ce lien soulève un bon point, mais est-ce encore un mauvaise idée si vous ne l'utilisez que pour les propriétés readwrite entièrement synthétisées? (ce qui signifie que vous ne déclarez pas synthétiser pour une propriété et que vous écrasez toujours le getter ou le setter) – Kevlar
C'est probablement très bien, pour l'instant, avec des propriétés entièrement synthétisées. Mais Apple ne garantit pas qu'il est autorisé et recommande contre cela, de sorte que cela pourrait casser dans tout futur SDK. –