problèmes avec des autoReleasePool
tablier
Membre
J'ai un problème de gestion de mémoire, notamment avec les autoReleasePool.
Je dois d'abord explicité l'architecture de mon programme pour bien m'expliquer.
Le Programme comporte 4 objets qui sont déclarés sous IB: contrôle, extraction, texte et generation. Donc ils sont instanciés au lancement et je ne les supprime jamais. Contrôle initialise et retient les variables Mutables générales que les trois autres objets utilisent.
Pour éviter de garder des variables locales inutilement, dans chacun des objets extraction, texte et generation j'ouvre un nouvel autoReleasePool, j'effectue le travail demandé, puis je "drain" et je retourne au contrôle. Cela marche parfaitement sous 10.5.11 et 10.6.8 mais très mal sous 10.7.2 (voir ce post). j'ai finis par supprimer l'utilisation des autoReleasePool dans les objets extraction, texte et generation et merveille, des tas d'erreurs inexplicables ont disparu.
Ma question: le contrôle des autoReleasePool est maintenu dans un stack. Si j'initialise un nouvel autoReleasePool pour un travail particulier, au cours de ce travail ai-je le droit de lire et/ou modifier les variables qui ne sont pas dans l'autoReleasePool courant?
Nota: Je n'arrive pas avec les textes, à voir pourquoi la construction ci-dessus serait interdites!
Je dois d'abord explicité l'architecture de mon programme pour bien m'expliquer.
Le Programme comporte 4 objets qui sont déclarés sous IB: contrôle, extraction, texte et generation. Donc ils sont instanciés au lancement et je ne les supprime jamais. Contrôle initialise et retient les variables Mutables générales que les trois autres objets utilisent.
Pour éviter de garder des variables locales inutilement, dans chacun des objets extraction, texte et generation j'ouvre un nouvel autoReleasePool, j'effectue le travail demandé, puis je "drain" et je retourne au contrôle. Cela marche parfaitement sous 10.5.11 et 10.6.8 mais très mal sous 10.7.2 (voir ce post). j'ai finis par supprimer l'utilisation des autoReleasePool dans les objets extraction, texte et generation et merveille, des tas d'erreurs inexplicables ont disparu.
Ma question: le contrôle des autoReleasePool est maintenu dans un stack. Si j'initialise un nouvel autoReleasePool pour un travail particulier, au cours de ce travail ai-je le droit de lire et/ou modifier les variables qui ne sont pas dans l'autoReleasePool courant?
Nota: Je n'arrive pas avec les textes, à voir pourquoi la construction ci-dessus serait interdites!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
as tu une programmation parallèle?
apres mettre un objet dans un AutoreleasePoll, puis le partager est une très mauvaise idée.
mais peut être que j'ai pas compris la question.
Bon, déjà (je sais que ce n'est qu'une question de terminologie, mais bon...), un autorelease pool ne contient pas de variables, mais des objets (ou autrement dit pointeurs sur zone mémoire contenant les variables d'instance).
Maintenant, pour répondre à la question, il est évidemment possible d'accéder à des objets qui ont été enregistrés dans un pool qui ne se trouve pas au sommet de la pile des pools, et heuresement parce que sinon ce serait vraiment une contrainte énorme...
Par contre, évidemment, il est plus que périlleux d'accéder à des objets qui ont été enregistrés dans un pool puis a été drainé, sauf à faire un retain sur lesdits objets avant le drainage (le drainage n'est rien de plus qu'un appel à release, donc on se protège contre une destruction lors d'un drainage de la même manière qu'on s'en protège lors d'un release).
Pas seulement, les pools sont également très utile à l'intérieur des boucles qui manipulent beaucoup d'objets, afin d'optimiser la libération de la mémoire.
Pas si un message retain est envoyé à cet objet.
oui, et encore on peut "faire" sans pool.
ce que je respecterais: bien mettre l'objet dans le pool de son "scope".
Et je ne comprends pas pourquoi ça marche sous 10.6.8 et pas sous Lion! Là , il faut que j'aille relire un peu de doc, car je ne saisis pas tout à fait l'idée!!
Ce truc marche tout seul du moment que, comme tout le reste, tu équilibre la création et le relâchement de l'objet à des endroits "symétriques" et pas n'importe où.
Ton problème est plutôt je pense dans ta gestion de la reccursivité, où tu dois sans doute créer des objets, les détruire et les utiliser dans une boucle récursive quand même.
Activé les NSZombies histoire de voir quels sont les objets fautifs.
Assures-toi que chaque objet que tu créés ou retain est toujours retain tant que tu en as besoin et l'utilise et ne le release/autorelease que quand tu n'en a plus besoin.
Je vais voir les zombies (on dirait un titre de film d'horreur).
http://itunes.apple.com/fr/app/plants-vs.-zombies/id410406848?mt=12
deactive tes autoreleasePools, as tu tjrs les mêmes bugs?
Au premier essai, en supprimant les autoreleasePoll cela devient bon sous 10.7 aussi. MAIS cela laisse apparaitre d'autres bugs en des points que je n'atteignais jamais avec les autoRP actifs.
Je suis en train de reprendre l'ensemble avant de remettre les autoReleasePool.
D'où l'intérêt de NSZombie pour qu'il te dise quand ça arrive et quel type d'objet c'est pour que tu voies tout de suite le pb.