[RESOLU] Problème de gestion de NSOutlineView

TMXTMX Membre
septembre 2007 modifié dans API AppKit #1
Salut à  tous les amateurs de chocolat,

Dans le cadre de mon application Mediamanager, je dois utiliser un NSOutlineView. Je précise quand même le cadre de ce développement : Objective-C sans Interface Builder et fichier Nib, les interfaces graphiques étant définies dans un fichier XML.

Lorsque j'ajoute la racine sans les enfants. Il n'y a aucun problème. Mais dès lors que je rajoute les enfants, je me retrouve avec le message d'erreur suivant :

*** Assertion failure in -[NSOutlineView _locationOfColumn:], TableView.subproj/NSTableView.m 535
Invalid parameter not satisfying: (index >= 0) && (index <= numColumns)
*** malloc[1272]: Deallocation of a pointer not malloced: 0xbfffe150; This could be a double free(), or free() called with the middle of an allocated bloc; Try setting environment variable MallocHelp to see tools to help debug

L'ennui, c'est que j'ai beau mettre des traces dans toutes mes méthodes, le message apparaà®t en dehors de ces méthodes.

Quelqu'un a t'il une idée ?  :o

Réponses

  • Philippe49Philippe49 Membre
    23:52 modifié #2
    je viens de finir la traduction de la doc sur XML.
    Peut-être cela répondra-t-il à  ta question ?
    Si tu fais sans IB, il faut faire les bindings à  la main.
  • Philippe49Philippe49 Membre
    23:52 modifié #3
    dans 1189079636:


    *** Assertion failure in -[NSOutlineView _locationOfColumn:], TableView.subproj/NSTableView.m 535
    Invalid parameter not satisfying: (index >= 0) && (index <= numColumns)
    *** malloc[1272]: Deallocation of a pointer not malloced: 0xbfffe150; This could be a double free(), or free() called with the middle of an allocated bloc; Try setting environment variable MallocHelp to see tools to help debug



    Le premier message d'erreur suggère de regarder le nombre de colonnes.
    Dans le second, quelle est la nature du pointeur ? 

     
  • TMXTMX Membre
    23:52 modifié #4
    Je n'utilise pas les bindings.

    Comme je suis sur Panther, je me suis fais un petit parser XML pour pouvoir créer des interfaces dynamiques. Tous les composants marchent nickels (y compris les TableView et les OutlineView). En fait, lorsque je ne met que la racine et que j'appelle la methode "reloadData", no problem. Mais lorsque je rajoute les noeuds enfants, j'obtiens le message décrit dans mon post précédent. Normalement, il n'y a qu'une seule colonne.

    En fait, Cocoa arrive à  créer l'interface, il appelle à  nouveau la methode "outlineView:objectValueForTableColumn:byItem" et c'est après qu'il affiche le message. Seulement, je ne sais pas dans quelle méthode Cocoa passe pour afficher un tel message.

    :why?:
  • Philippe49Philippe49 Membre
    23:52 modifié #5
    dans 1189090552:


    En fait, Cocoa arrive à  créer l'interface, il appelle à  nouveau la methode "outlineView:objectValueForTableColumn:byItem" et c'est après qu'il affiche le message. Seulement, je ne sais pas dans quelle méthode Cocoa passe pour afficher un tel message.

    :why?:


    On peut le voir dans le debogueur  (dans XCode : Debug Executable, ou avec gdb)
    Il me semble important de voir la classe qui pose le problème de désallocation
  • Philippe49Philippe49 Membre
    23:52 modifié #6
    dans 1189090552:



    Comme je suis sur Panther, je me suis fais un petit parser XML pour pouvoir créer des interfaces dynamiques.


    Je ne vois pas ce qu'un fichier XML a à  voir avec des interfaces dynamiques ... mais je ne demande qu'à  voir !

    8--)
  • TMXTMX Membre
    23:52 modifié #7
    J'ai essayé de débugger le code mais çà  ne m'a pas apporté plus de précisions quant la nature du problème.

    En plus, je ne peux pas faire un "step into" sur la méthode "reloadData".

    Je ne sais vraiment plus d'où vient le problème. Ce que je sais c'est que j'ai absolument besoin d'un NSOutlineView étant donné qu'il faut que je gère les supports.

    Je vais essayer de te balancer mes fichiers qui posent problème.
  • TMXTMX Membre
    23:52 modifié #8
    Voici les fichiers

    [Fichier joint supprimé par l'administrateur]
  • Philippe49Philippe49 Membre
    23:52 modifié #9
    - (void)setFather:(id)pFather
    {
    clFather = pFather;
    }


    Tu es sur de la bonne gestion  mémoire ( retainCount)

    Ajoute une méthode dealloc sur le modèle traditionnel, dans lequel tu ajoute un mouchard NSLog(@Deallocing %@", self); et tous les release ou autorelease nécessaires.
    Voir également l'article NSOutlineView & Trees sur ce site pour comparer la gestion mémoire  (ce n'est pas forcément le mieux qui est écrit dans cet article).


  • TMXTMX Membre
    23:52 modifié #10
    J'ai réessayé l'exemple que tu cites mais sans succès.

    Le programme ne passe pas dans la méthode "dealloc". :(

    Sinon, je confirme que lorsqu'il n'y a que des noeuds de premier niveau, il n'y a aucun problème mais dès lors que j'ajoute des enfants à  ces noeuds, c'est la cata.  :(

    De plus, il ne m'affiche pas les triangles quand bien même il y a des enfants.

    Une idée ??
  • Philippe49Philippe49 Membre
    23:52 modifié #11
    dans 1189162274:

    Le programme ne passe pas dans la méthode "dealloc". :(


    Si ce n'est pas l'une des instances de tes classes qui est désallouée (cf message d'erreur), c'est quoi ? une vue avec un mauvais retainCount ?

    dans 1189162274:

    Sinon, je confirme que lorsqu'il n'y a que des noeuds de premier niveau, il n'y a aucun problème mais dès lors que j'ajoute des enfants à  ces noeuds, c'est la cata.


    Là  encore il s'agit d'objets qui devrait exister et qui n'existe pas ou plus .. gestion de mémoire

    ajouter des enfants, c'est déclarer des father de là  à  revenir sur une analyse approfondie de ta méthode setFather
  • TMXTMX Membre
    23:52 modifié #12
    J'ai réecrit entièrement le code de PreferenceNode.h et PreferenceNode.m. Ces deux fichiers sont proches de ceux donnés dans l'exemple de ce site.

    Mais çà  ne fonctionne toujours pas.

    Connais tu l'ordre d'appel des fonctions utilisées pour le NSOutlineView parce que dans l'erreur on me parle d'un numéro de colonne mais comme je ne sais pas où mettre d'autres traces et que le debugger ne m'apporter aucune précisions sauf du code assembleur incompréhensible ?
  • Philippe49Philippe49 Membre
    23:52 modifié #13
    dans 1189162274:

    J'ai réessayé l'exemple que tu cites mais sans succès.


    Sans succès ?
  • Philippe49Philippe49 Membre
    23:52 modifié #14
    dans 1189167461:

    Connais tu l'ordre d'appel des fonctions utilisées pour le NSOutlineView parce que dans l'erreur on me parle d'un numéro de colonne

    Tu as essayé un mouchard NSLog dans chaque delegate method en demandant de décrire les arguments ?
  • AliGatorAliGator Membre, Modérateur
    23:52 modifié #15
    Pourquoi ne veux-tu pas essayer de modifier le setFather comme te le propose Philippe49, pour qu'il suive le schema classique du code d'un "setter" et pour qu'il ne provoque pas de fuite mémoire ?
    - (void)setFather:(id)pFather<br />{<br />&nbsp;  if (pFather != clFather)<br />&nbsp;  {<br />&nbsp; &nbsp; &nbsp; [clFather release];<br />&nbsp; &nbsp; &nbsp; clFather = [pFather retain];<br />&nbsp;  }<br />}
    
    ou
    - (void)setFather:(id)pFather<br />{<br />&nbsp;  [pFather retain]; // lui en premier<br />&nbsp;  [clFather release]; // et lui en second absolument<br />&nbsp;  // (sinon y&#39;a problème dans le cas où pFather et clFather seraient le même objet)<br />&nbsp;  clFather = pFather; // et là  seulement on peut affecter.<br />}
    


    Sinon pour le dealloc, faut faire gaffe à  bien avoir écrit la méthode car comme c'est une methode delegate, une coquille/faute de frappe et elle ne sera pas reconnue donc pas appelée...
  • TMXTMX Membre
    23:52 modifié #16
    J'ai déjà  essayer de modifier le "setFather" comme indiqué mais je n'ai pas eu plus de succès.  :(

    Le problème maintenant, c'est qu'il n'y a même plus de méthode "setFather" puisque je suis reparti du code fourni par le PDF indiqué sur ce site.

    J'ai déjà  mis des traces dans les methodes delegate que j'ai surchargées :
    - (id)outlineView:(NSOutlineView *)pOutlineView child:(int)pIndex ofItem:(id)pItem
    - (int)outlineView:(NSOutlineView *)pOutlineView numberOfChildrenOfItem:(id)pItem
    - (BOOL)outlineView:(NSOutlineView *)pOutlineView isItemExpandable:(id)pItem
    - (id)outlineView:(NSOutlineView *)pOutlineView objectValueForTableColumn:(NSTableColumn *)pTableColumn byItem:(id)pItem

    Le message d'erreur apparaà®t après être passé dans toutes les méthodes. ??
  • Philippe49Philippe49 Membre
    23:52 modifié #17
    Cela ferait plutôt penser que l'erreur est au niveau de l'interface graphique ..

    ou que les objets renvoyés par l'une des quatre a un retainCount insuffisant

    je reviens sur le message d'erreur :
    Deallocation of a pointer not malloced:
    cela signifie peut-être que tu crois avoir réservé une zone mémoire pour un pointeur et que ce n'est pas la réalité.
    ex : [NSString stringWithFormat:....] crée des objets en autorelease alors que [ ..alloc] initWith ... ] met le retainCount à  1 .
  • TMXTMX Membre
    23:52 modifié #18
    Oui c'est certain.

    Par contre, comment expliquer que lorsque je ne met pas les enfants, il n'y a aucun problème et que lorsque je met les enfants, çà  ne marche plus. Compte tenu que tous les composants de l'interface graphique sont séparés et indépendants les uns des autres, çà  doit venir de la mémoire utilisée par les enfants. Non ?
  • Philippe49Philippe49 Membre
    23:52 modifié #19
    dans 1189079636:
    le message d'erreur suivant :

    *** Assertion failure in -[NSOutlineView _locationOfColumn:], TableView.subproj/NSTableView.m 535
    Invalid parameter not satisfying: (index >= 0) && (index <= numColumns)


    La méthode de NSTableView a ce prototype :
    - (float) _locationOfColumn: (int) parameter1;

    c'est un peu comme si la colonne de l'olv n'était pas référencée
  • TMXTMX Membre
    23:52 modifié #20
    Oui c'est bien possible.

    Mais je ne sais pas trop. Etant donné que tous les composants de la vue sont stockés dans un dictionnaire. Pourtant, il n'y a aucun problème avec les Table View et les Combo. Ca ne devrait pas poser de probleme avec les Outline View qui ne sont que des Table View avec arborescence.

    J'ai beau changer mon code avec tous les codes que je trouve sur la toile et j'ai toujours le même résultat. Je me demande si je ne vais pas devoir developper mon propre Tree View.  :-\\

    J'en ai pourtant absolument besoin. Fait suer. Et pas moyen de savoir pourquoi çà  ne marche pas avec les enfants.
  • 23:52 modifié #21
    Tu as déjà  essayé de réveiller quelques zombies?

    (c'est un lien, je précise car quand la phrase est entière, c'est assez discret)
  • TMXTMX Membre
    23:52 modifié #22
    Je vais essayer.

    Je te remercie.  8--)
  • TMXTMX Membre
    23:52 modifié #23
    C'est bon !!!  :)

    J'ai enfin trouvé après des jours de travail.

    J'avais oublié de spécifier avec la méthode "setOutlineTableColumn" la colonne à  prendre en compte pour afficher la vue hiérarchique.

    Eh beh. Je vais enfin pouvoir gérer les supports comme je le voulais.

    Youpiiiiii  :kicking: <3 :(renaud):
  • Philippe49Philippe49 Membre
    23:52 modifié #24
    dans 1189174495:

    dans 1189079636:
    le message d'erreur suivant :

    *** Assertion failure in -[NSOutlineView _locationOfColumn:], TableView.subproj/NSTableView.m 535
    Invalid parameter not satisfying: (index >= 0) && (index <= numColumns)


    La méthode de NSTableView a ce prototype :
    - (float) _locationOfColumn: (int) parameter1;

    c'est un peu comme si la colonne de l'olv n'était pas référencée


    Les messages d'erreur sont parfois beaucoup plus bavards qu'on ne le croit..

    bonne continuation et puis moi aussi après tout  :(renaud):
  • TMXTMX Membre
    23:52 modifié #25
    Merci bcp Philippe pour ton aide très précieuse.

    Grâce à  AppKiDo, j'ai pu m'apercevoir de mon erreur.

    C'était simple mais il fallait le savoir. J'ai à  présent référencé dans mon format XML, un paramètre permettant de définir la colonne à  prendre en compte lors d'un OutlineView

    <XGSViewItemProperty key="OutlineTableColumn" value="Value" />

    Bonne continuation !  ;)
Connectez-vous ou Inscrivez-vous pour répondre.