Problème de retain/release

LeChatNoirLeChatNoir Membre, Modérateur
22:41 modifié dans API AppKit #1
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 !

Réponses

  • mars 2007 modifié #2
    D'une règle générale, suivre les retainCount est très très déconseillé, car tu ne peux pas savoir quels sont les objets qui retiennent tes objets à  toi.

    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.
  • Philippe49Philippe49 Membre
    22:41 modifié #3
    Il y a des informations sur ce sujet dans l'article NSOutlineView & trees

Connectez-vous ou Inscrivez-vous pour répondre.