[RESOLU] Problème de gestion de NSOutlineView
TMX
Membre
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 ?
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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Peut-être cela répondra-t-il à ta question ?
Si tu fais sans IB, il faut faire les bindings à la main.
Le premier message d'erreur suggère de regarder le nombre de colonnes.
Dans le second, quelle est la nature du pointeur ?
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?:
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
Je ne vois pas ce qu'un fichier XML a à voir avec des interfaces dynamiques ... mais je ne demande qu'à voir !
8--)
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.
[Fichier joint supprimé par l'administrateur]
{
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).
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 ??
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 ?
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
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 ?
Sans succès ?
Tu as essayé un mouchard NSLog dans chaque delegate method en demandant de décrire les arguments ?
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...
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. ??
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 .
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 ?
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
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.
(c'est un lien, je précise car quand la phrase est entière, c'est assez discret)
Je te remercie. 8--)
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: :(renaud):
Les messages d'erreur sont parfois beaucoup plus bavards qu'on ne le croit..
bonne continuation et puis moi aussi après tout :(renaud):
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 !