Build en Debug : OK - Release : KO

skimpyskimpy Membre
mars 2006 modifié dans API AppKit #1
Bonsoir,

J'ai un problème avec le build de mon appli. Quand c'est compilé en mode Debug, ça fonctionne et dès que je passe en mode Release ... ça plante.
Je pense avoir trouvé l'endroit du plantage mais je ne comprends pas : dans mon 1er fichier NIB, la méthode init instancie un objet (dans un 2nd NIB dont le File's Owner est de type NSWindowController) :

myWindow = [[NLController alloc] init];
-> L'allocation de cet objet semble se passer correctement (du moins, c'est ce que me disent les divers NSLog que j'ai mis);

Dans le awakeFromNib du 1er NIB, dès que je fais un [myWindow showWindow:self]; -> ça plante avec un EXC_BAD_ACCESS. J'ai contrôlé la valeur de retour de self dans le init de NLController et il n'est pas à  nil. Si je commente cette ligne, l'appli démarre mais bien sûr n'affiche rien.

Est-ce que vous avez une idée ?

Merci.

Réponses

  • Eddy58Eddy58 Membre
    09:37 modifié #2
    Dans ton NSWindowController, est-ce que tu initialises correctement ton fichier nib via une méthode de type - (id)initWithWindowNibName:(NSString *)windowNibName ? :o
  • skimpyskimpy Membre
    mars 2006 modifié #3
    Oui, j'ai bien spécifié : self = [super initWithWindowNibName:@MonAppli];

    Par contre, je viens de m'apercevoir d'un truc qui est la cause de mon problème : dans mon init du NSWindowController, j'instancie un autre objet (de la classe Toto). Le init de la classe Toto est composé de la façon suivante :
    <br />- (id)init<br />{<br />	NSLog(@&quot;		|- Toto - init - initialisation des variables&quot;);<br />	if(self = [super init])<br />	{<br />		dico1	= [[NSMutableDictionary alloc] init];<br />		tab		= [[NSMutableArray alloc] init];<br />		dico2	= [[NSMutableDictionary alloc] init];<br />		dico3	= [[NSMutableDictionary alloc] init];<br />		dico4	= [[NSMutableDictionary alloc] init];<br />	}<br />	<br />	NSLog(@&quot;		|- Toto - init - Fin initialisation des variables dico1 = %@&quot;, dico1);<br />	<br />	return self;<br />}<br />
    


    Quand je lui demande de m'afficher l'adresse de dico1 par exemple ... y'a rien ! et donc la suite de mon programme plante parce que ça s'appuie sur les données contenues dans cet objet là  !

    [EDIT] : Il passe bien dans la condition if

    [EDIT 2] : j'ai modifié le dico1 = [[NSMutableDictionary alloc] init]; par dico1 = [[NSMutableDictionary dictionary] retain]; et ça ne fait rien de plus. J'ai toujours en résultat :
    - Toto - init - Fin initialisation des variables dico1 ={}
  • Eddy58Eddy58 Membre
    09:37 modifié #4
    dans 1141510352:

    j'ai modifié le dico1 = [[NSMutableDictionary alloc] init]; par dico1 = [[NSMutableDictionary dictionary] retain]; et ça ne fait rien de plus. J'ai toujours en résultat :
    - Toto - init - Fin initialisation des variables dico1 ={}

    C'est tout à  fait normal, ce résultat indique que ton dico est vide et bien initialisé. Comment remplis tu tes conteneurs ensuite ?
  • skimpyskimpy Membre
    mars 2006 modifié #5
    En effet, tu as bien raison ! Je viens de modifier tout mon programme pour m'apercevoir que ce n'était pas ça.
    Mon autre piste se tourne vers une outlineView que j'ai. Dès que je lui affecte un NSMutableArray et que je fais un reloadData derrière, ça plante. Pourtant en Build Debug ça passe ...

    J'ai mis en capture d'écran l'erreur où ça plante.

    [EDIT] : Bon il passe dans la méthode - (id) outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item et boom, c'est là  qu'apparaà®t GDB avec la capture jointe.
    La fonction se contente simplement de faire :
    <br />- (id)	outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item<br />{<br />	NSLog(@&quot;outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item&quot;);<br />		<br />	return (item == nil) ? @&quot;/&quot; : @&quot;item&quot;;<br />}<br />
    


    [Fichier joint supprimé par l'administrateur]
  • Eddy58Eddy58 Membre
    mars 2006 modifié #6
    Si ça plante au reloadData, je verrais bien un problème dans tes méthodes datasources. Comment les as-tu implémentées ? :o

    [EDIT] Ha ben t'as édité...donc il y a bien un problème dans tes datasources. Comment sont implémentées les autres ?
  • skimpyskimpy Membre
    mars 2006 modifié #7
    Bon alors en fait ma outlineView comporte 2 colonnes. Quand je vire la 2ème colonne, ça fonctionne.

    <br />- (id)	outlineView:(NSOutlineView *)ov child:(int)index ofItem:(id)item<br />{<br />	NSLog(@&quot;outlineView:(NSOutlineView *)ov child:(int)index ofItem:(id)item&quot;);<br />	if(item == nil)<br />		return [rootNode objectAtIndex:index];<br />	else<br />		return [item childAtIndex:index];<br />}<br /><br />- (BOOL)	outlineView:(NSOutlineView *)ov isItemExpandable:(id)item<br />{<br />	NSLog(@&quot;outlineView:(NSOutlineView *)ov isItemExpandable:(id)item&quot;);<br />	return [item isExpandable];<br />}<br /><br />- (int)	outlineView:(NSOutlineView *)ov numberOfChildrenOfItem:(id)item<br />{<br />	NSLog(@&quot;outlineView:(NSOutlineView *)ov numberOfChildrenOfItem:(id)item&quot;);<br />	if(item == nil)<br />		return [rootNode count];<br />	<br />	return [item childCount];<br />}<br /><br />- (id)	outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item<br />{<br />	 NSLog(@&quot;outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item : %@&quot;, [tableColumn identifier]);<br />		<br />	return [item keyValue:[tableColumn identifier]];<br />}<br />
    


    item est un objet qui est constitué d'un dictionnaire data et d'un tableau child. Le dictionnaire data contient plusieurs clés (6 au total) qui font référence à  l'identifier déclaré dans IB pour mon outlineview.
  • Eddy58Eddy58 Membre
    mars 2006 modifié #8
    Il te manque un else dans cette méthode : :o
    [tt]
    - (int)outlineView:(NSOutlineView *)ov numberOfChildrenOfItem:(id)item
    {
    NSLog(@outlineView:(NSOutlineView *)ov numberOfChildrenOfItem:(id)item);
    if(item == nil)
    return [rootNode count];
    else
       return [item childCount];
    }
    [/tt]
    Quoique ça doit marcher sans...
  • skimpyskimpy Membre
    mars 2006 modifié #9
    Bonjour,

    Non, le else ne change rien. C'est dès que je rajoute cette 2ème colonne dans ma outlineView que ça plante (ou que je clique dedans) ... et pourtant l'identifiant de colonne est bien défini.
  • ChachaChacha Membre
    09:37 modifié #10
    Salut,

    Et si tu nous montrais le crash log ? ça aide vachement à  comprendre où ça plante !
    +
    Chacha
  • skimpyskimpy Membre
    09:37 modifié #11
    Salut,

    Je viens de trouver à  l'instant mon erreur : ça venait d'un delegate que j'avais implémenté et d'un release qui était positionné n'importe où !

    Voilà  le delegate :
    -(void)outlineView: (NSOutlineView *)ov willDisplayCell: (NSCell *)cell forTableColumn: (NSTableColumn *)tableColumn item: (id)item

    -> Je faisais un release à  l'extérieur d'une condition if dans laquelle j'initialisais une variable avec un init.

    Maintenant, ça fonctionne ! Et même avec 2 colonnes !

    Merci pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.