Problème avec un NSMutableArray
gibet_b
Membre
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 :
Dans mon PaintView.m, j'initialise le tableau comme cela :
Puis j'ajoute des objets de type NSBezierPath (j'ai essayé d'ajouter d'autre type d'objet avec le même résultat) :
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 !
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(@"Initialisateur");<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 !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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]
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)
Merci
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 ?
C'est normal que cela ne trace rien car il te manque un petit morceau de code :
et
Je ne comprends pas pourquoi ça ne passe pas chez moi >:( Il doit pourtant y avoir une raison, forcément !
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 !
Perso ça m'arrive plein plein de fois de faire, parce que je n'y penses pas, des trucs comme :
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)
En effet c'est un peu énervant...
Merci également pour le message de bienvenue ! Je vais sans doute hanter quelque peu ces forums dans les temps à venir