Problème avec un NSMutableArray

gibet_bgibet_b Membre
06:31 modifié dans API AppKit #1
Salut,

Je suis en train de découvrir le Cocoa et je fais une petite appli permettant de dessiner des traits dans un CustomView.

Dans mon PaintView.h (héritant de NSView), j'ai :
@interface PaintView : NSView<br />{<br />	NSPoint pointOrigine;<br />	NSPoint pointFinal;<br />	<br />	NSMutableArray *tabTraits;<br />}


Dans mon PaintView.m, j'initialise le tableau comme cela :
- (id)initWithFrame:(NSRect)frameRect<br />{<br />	if ((self = [super initWithFrame:frameRect]) != nil) {<br />		// Add initialization code here<br />		tabTraits = [[NSMutableArray alloc] init];<br />		NSLog(@&quot;Initialisateur&quot;);<br />	}<br />	<br />	return self;<br />}


Puis j'ajoute des objets de type NSBezierPath (j'ai essayé d'ajouter d'autre type d'objet avec le même résultat) :
- (void)mouseUp:(NSEvent *)event<br />{<br />	NSPoint p = [event locationInWindow];<br />	NSBezierPath *dernierTrait;<br />		<br />	pointFinal= [self convertPoint:p fromView:nil];<br />	<br />	dernierTrait = [[NSBezierPath alloc] init];<br />	[dernierTrait setLineWidth:2.3];<br />	[dernierTrait moveToPoint:pointOrigine];<br />	[dernierTrait lineToPoint:pointFinal];<br />	[dernierTrait closePath];<br />	<br />	[tabTraits addObject:dernierTrait];<br />	<br />	[dernierTrait release];<br />	<br />	[self setNeedsDisplay:YES];<br />}


Quand j'exécute le programme, cela plante (affichage du debugger) au moment d'ajouter un objet au tableau.

Quelqu'un aurait une idée ?

Merci !

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    avril 2006 modifié #2
    Slt,
    Ca doit être l'init de ton array qui manque d'un retain...

    Soit tu fais :
    monarray=[[NSMutableArray arrayWithCapacity:200] retain];

    Soit :
    monarray=[[NSMutableArray alloc] init];

    Je pense que ça devrait résoudre ton pb...
    a+

    Au fait, Welcome  :fouf):

    [edit]J'ai corrigé après coup ce post car Renaud m'a fait remarqué que j'avais écrit une grosse bourde... j'avais mis le retain sur la ligne avec alloc/init (inutile) et pas de retain sur l'autre (alors que nécessaire)...[/edit]
  • gibet_bgibet_b Membre
    avril 2006 modifié #3
    Merci mais, non, ça ne change rien  :(

    Le debugger s'arrête sur cette ligne, je ne sais pas si cela peut renseigner sur l'origine du problème (j'ai jamais rien compris à  cet aspect des debugger)

    0xfffeff10  &lt;+0016&gt;  lwz	r12,0(r3)<br />
    


    Merci
  • LeChatNoirLeChatNoir Membre, Modérateur
    06:31 modifié #4
    Non ca n'aide pas... Quand tu as ça, il vaut mieux remonter en arrière dans les actions pour voir d'où ça a commencé.

    Désolé, j'ai répondu un peu vite tout à  l'heure. Un init fait implicitement un retain sur l'objet.

    J'ai donc récup' ton exemple de code, fais un test et chez moi, ca passe... Ca trace rien mais ca passe.


    J'imagine que ta classe n'est pas instanciée dans IB et que tu as mis PaintView comme custom class de ta custom view non ?

  • gibet_bgibet_b Membre
    06:31 modifié #5
    En effet j'ai mis PaintView comme CustomClass de ma CustomView ;)

    C'est normal que cela ne trace rien car il te manque un petit morceau de code :
    - (void)mouseDown:(NSEvent *)event<br />{<br />	NSPoint p = [event locationInWindow];<br />	pointOrigine = [self convertPoint:p fromView:nil];<br />	[self setNeedsDisplay:YES];<br />}
    


    et

    - (void)drawRect:(NSRect)rect<br />{<br />	int i;<br />	NSRect bounds = [self bounds];<br />	[[NSColor grayColor] set];<br />	[NSBezierPath fillRect:bounds];<br /><br />	[[NSColor redColor] set];<br />			<br />	NSLog(@&quot;Nombre d&#39;element du tableau : %@&quot;,[tabTraits count]);<br /><br />	for(i = 0 ; i &lt; [tabTraits count] ; i++){<br />		NSLog(@&quot;Dessine un trait&quot;);<br />		[[tabTraits objectAtIndex:i] stroke];<br />	}<br />}
    


    Je ne comprends pas pourquoi ça ne passe pas chez moi  >:( Il doit pourtant y avoir une raison, forcément !
  • LeChatNoirLeChatNoir Membre, Modérateur
    06:31 modifié #6
    Ah ben ca y est, ca plante.
    Et ca y est, j'ai trouvé. le count d'un tableau est un entier donc il faut mettre :
    NSLog(@Nombre d'element du tableau : %d,[tabTraits count]);

    Et pas %@...

    Bonne nuit !
  • AliGatorAliGator Membre, Modérateur
    06:31 modifié #7
    Alors ça c'est le genre de bug le plus vexant : quand c'est les NSLogs qu'on met pour essayer de suivre le déroulement du programme (et donc comprendre et débuguer)... qui sont la source du plantage !!

    Perso ça m'arrive plein plein de fois de faire, parce que je n'y penses pas, des trucs comme :
    NSPoint* p = [evt locationInWindow];<br />NSLog(@&quot;%@&quot;,p); // crash !
    
    Et quand je vois qu'il me lance le débuguer à  cet endroit du code, à  chaque fois je me dis "bon sang mais c'est pas vrai, encore la même erreur !" et je remplace par :
    [tt]NSLog(@%@",NSStringFromPoint(p));[/tt]

    J'arrive que très rarement à  y penser du premier coup :-/

    Faut faire gaffe avec les NSLog on est tellement habitués à  utiliser NSLog(@%@",...) qu'on ne fait parfois même plus attention au type de la variable qu'on met après... qui se trouve être dans 90% des cas un NSObject (donc tout va bien), mais parfois pas... (et donc c'est pas fait pour et ça plante)
  • gibet_bgibet_b Membre
    06:31 modifié #8
    Merci 1000 fois ! 

    En effet c'est un peu énervant...

    Merci également pour le message de bienvenue !  <3 Je vais sans doute hanter quelque peu ces forums dans les temps à  venir  :o
Connectez-vous ou Inscrivez-vous pour répondre.