Problème de retain/release
LeChatNoir
Membre, Modérateur
Salut,
Décidément, je suis fâché avec la gestion mémoire.... :-(
Je crois avoir compris les grands fondamentaux (pointeurs, zone mémoire, retain/release) mais j'ai encore un problème...
J'ai un arbre (dossiers/fichiers).
Lorsque je veux le détruire, je balance un release sur la racine.
Le release déclenche la méthode dealloc qui elle même release les children et autres variables d'instance. Seulement mes children ont un retaincount bien trop élevé pour être à leur tour désalloués... Je me retrouve donc avec.... un arbre sans racine ;-)
Et c'est triste un arbre sans ses racines (ça, c'est mon côté écolo !).
Donc, vous affolez pas, je vais pas vous coller mon code spagetthi ici, j'ai juste 3 questions :
1 - est il possible de suivre facilement le retaincount des objets sans avoir à faire des NSLogs ?
2 - Est ce que les bindings avec ArrayControllers peuvent jouer sur le retainCount ? Dans ce cas, faut faire un unbind ? un release ?
3 - Est ce qu'une outlineView ou une tableView font aussi des retain ? Dans ce cas, faut faire un setDatasource:nil ?
Merci de votre aide !
Décidément, je suis fâché avec la gestion mémoire.... :-(
Je crois avoir compris les grands fondamentaux (pointeurs, zone mémoire, retain/release) mais j'ai encore un problème...
J'ai un arbre (dossiers/fichiers).
Lorsque je veux le détruire, je balance un release sur la racine.
Le release déclenche la méthode dealloc qui elle même release les children et autres variables d'instance. Seulement mes children ont un retaincount bien trop élevé pour être à leur tour désalloués... Je me retrouve donc avec.... un arbre sans racine ;-)
Et c'est triste un arbre sans ses racines (ça, c'est mon côté écolo !).
Donc, vous affolez pas, je vais pas vous coller mon code spagetthi ici, j'ai juste 3 questions :
1 - est il possible de suivre facilement le retaincount des objets sans avoir à faire des NSLogs ?
2 - Est ce que les bindings avec ArrayControllers peuvent jouer sur le retainCount ? Dans ce cas, faut faire un unbind ? un release ?
3 - Est ce qu'une outlineView ou une tableView font aussi des retain ? Dans ce cas, faut faire un setDatasource:nil ?
Merci de votre aide !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cependant, dans le cas des arbres, le coup très classique est le référencement croisé, si ta classe prévoit une méthode pour remonter l'arbre.
Si tu as des variables telles que:
NSMutableArray *children;
Node *parent;
Et que tu fais un retain dans ton setParent:, c'est foutu, tu as une fuite mémoire. Car pour releaser le tableau, il faut le releaser le parent, seulement le parent ne pourra jamais être releasé, car il est retenu par ses enfants.
Donc pour le setParent, il faut juste faire un parent = aParent, SANS le retain.