Forcer un objet à se désallouer sous ARC
Je suis en train de travailler sur un iPad de collage de photo application qui s'inspire peut-être des centaines de UIImageView
s sur l'écran à la fois.
Il y a un bouton qui permet à l'utilisateur de "re-créer", qui est supposé exécuter un for
boucle à [photo removeFromSuperview]
sur toutes les photos puis initialiser un nouveau lot, dans cet ordre.
Je suis à l'aide de l'ARC, et ma console me dit que ma Photo
's dealloc
méthode n'est pas appelée qu'APRÈS la prochaine fournée a été établi, ce qui signifie que je suis en cours d'exécution dans la mémoire, même si j'essaie d'enlever le premier set avant de l'ajouter à la prochaine série.
Est-il un moyen de soit 1) attendre jusqu'à ce que toutes les photos ont été correctement dealloc avais ou 2) de la force de toutes les photos à dealloc immédiatement sous l'ARC?
source d'informationauteur user339946 | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement mettre votre image vue dans un autorelease pool sans s'en rendre compte. Vous pouvez peut-être résoudre ce problème en emballage de votre propre autorelease pool autour de votre boucle for.
Par exemple, j'ai fait un très simple projet de test avec une image et un bouton sous mon affichage de niveau supérieur. Quand j'appuie sur le bouton, il supprime l'affichage de l'image et en crée une nouvelle. Il supprime l'affichage de l'image en faisant une boucle sur le dessus au niveau de la vue des sous-vues. Voici le code:
Quand j'ai couru sous les Dotations de l'instrument avec “Enregistrer le nombre de références” est activé, j'ai vu que chaque retiré d'affichage de l'image n'a pas été libéré au cours de
destroyImageView
. Au lieu de cela, il a été libéré plus tard, lorsque l'exécution de la boucle appelé-[NSAutoreleasePool release]
.Puis j'ai changé
destroyImageView
de gérer ses propres autorelease pool:Quand j'ai couru de nouveau en vertu des Instruments, j'ai vu que chaque retiré d'affichage de l'image a été libéré au cours de
destroyImageView
à la fin de la@autoreleasepool
bloc.ARC
dealloc
s de tout objet pour lequel il n'y a plus de solides références. Donc, pourdealloc
quelque chose, il suffit de définir toutes les variables pointant vers elle pournil
et assurez-vous que l'objet n'est pas impliqué dans toute référence circulaire.