Problème d'ajout d'objets dans un tableau

MaMa Membre
21:54 modifié dans API AppKit #1
Bonjour à  tous,
je tiens en premier lieu à  préciser que je suis un ultime débutant en objective-C et que je développe par pur intérêt de la chose. Donc voici mon problème: j'ai créé un projet cocoa d'une application de document. Grosso modo, j'ai ecrit 3 classes:

controller
objetMini
objetMaxi

le but était que lorsque je clique sur un bouton, une série d'objets basés sur objetMini se créent et s'ajoutent au tableau généré par objetMaxi. Je me suis donc fait un ibaction dans controller qui ressemble a ceci

objetMaxi *tableau = [[objetMaxi alloc] init];
int i;
for(i=0;i<=5;i++){
objetMini *nouvelObjet = [[objetMini alloc] alloc];
[nouvelObjet methodeQuelconque:i];
}
[tableau methodeDajout:nouvelObjet];

----
ici methodeDajout est simplement:

-(void)methodeDAjout:(NSObject *)objet{
[variableDinstance addObject:object];
}

----
le truc c'est que si je fais un NSLog du tableau à  un index précis (peut importe l'index) j'obtiens null dans la console. Si je change tableau par un NSMutableArray local à  ma classe, ça fonctionne. J'ai essayé plusiuers chose et vraiment je bloque.

Ma

Réponses

  • iSofTomiSofTom Membre
    21:54 modifié #2
    Salut,
    j'ai pas très bien compris ce que devait faire ton code exactement, mais j'ai remarqué quelques erreurs:
    premièrement pour instancier ton objetMini tu lui envoi deux fois alloc, il faut faire plutôt:
    objetMini *nouvelObjet = [[objetMini alloc] init]
    

    ensuite en dehors de ta boucle for tu fais appel à  ton objet "nouvelObjet" dont la portée est à  l'intérieur de cette boucle for puisque il est créé dedans.
  • 21:54 modifié #3
    C'est plutôt comme ça :

    <br />objetMaxi *tableau = [[objetMaxi alloc] init];<br />int i;<br />for(i=0;i&lt;=5;i++){<br />objetMini *nouvelObjet = [[objetMini alloc] alloc];<br />[nouvelObjet methodeQuelconque:i];<br />[tableau methodeDajout:[nouvelObjet autorelease]];<br />}<br /><br />[tableau release]; // ?<br />
    
  • MaMa Membre
    21:54 modifié #4
    Bonjour,
              Tout d'abord, je suis désolé pour les diverses erreurs qui ont pu se glisser dans le message que j'ai écris. En fait, je l'ai écris sur mon iPhone dans l'autobus, alors ma capacité de visualisation du tout était quelque peu diminuée. Je crois qu'il serait préférable de vous envoyer le code complet... Il s'agit en fait de la version la plus diminuée que je pouvais faire pour montrer mon problème:

    objetMaster.h

    #import <Cocoa/Cocoa.h>


    @interface objetMaster : NSObject {
    NSMutableArray*tableau;
    }
    -(void)ajoutTableau:(NSObject*)objet;
    -(NSMutableArray*)tableau;
    @end

    objetMaster.m
    #import "objetMaster.h"



    @implementation objetMaster
    -(void)ajoutTableau:(NSObject*)objet{
    [tableau addObject:objet];
    }
    -(NSMutableArray *)tableau{
    return tableau;
    }
    @end

    objetMini.h
    #import <Cocoa/Cocoa.h>


    @interface objetMini : NSObject {
    NSString*champsDeTexte;
    }
    -(void)importerChampsDeTexte:(NSString*)champs;
    -(NSString*)champsDeTexte;
    @end



    objetMini.m
    #import "objetMini.h"


    @implementation objetMini
    -(void)importerChampsDeTexte:(NSString*)champs{
    champsDeTexte = champs;
    }
    -(NSString*)champsDeTexte{
    return champsDeTexte;
    }
    @end

    controller.h
    #import <Cocoa/Cocoa.h>


    @interface controller : NSObject {

    }
    -(IBAction)fonction:(id)sender;
    -(void)creerTableau;
    @end



    controller.m
    #import "controller.h"
    #import "objetMini.h"
    #import "objetMaster.h"


    @implementation controller
    -(IBAction)fonction:(id)sender{
    [self creerTableau];

    }
    -(void)creerTableau{
    objetMaster *tableau = [[objetMaster alloc]init];
    NSMutableArray *tableauLocal = [[NSMutableArray alloc] init];
    int i;
    for(i=0;i<=29;i++){
    NSString *Nouvelle = @Test;
    objetMini *objet = [[objetMini alloc]init];
    [objet importerChampsDeTexte:Nouvelle];
    [tableau ajoutTableau:objet];
    [tableauLocal addObject:objet];
    }
    NSLog(@%@",[[tableau tableau] objectAtIndex:0]);
    NSLog(@%@",[tableauLocal objectAtIndex:0]);

    }
    @end



    Et voici le résultat que j'obtiens sur la console:

    [Session started at 2009-11-20 10:38:58 -0500.]
    GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul  3 01:19:56 UTC 2009)
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "x86_64-apple-darwin".
    tty /dev/ttys001
    Loading program into debugger...
    Program loaded.
    run
    [Switching to process 9377]
    Running...
    2009-11-20 10:39:00.908 Untitled[9377:a0f] (null)
    2009-11-20 10:39:00.910 Untitled[9377:a0f] <objetMini: 0x10012ccf0>


    On peut voir que le l'objet à  l'indice 0 pour le tableau de la classe objetMaster est (null) alors qu'il existe un objetMini pour le tableauLocal... Et c'est précisément ici que ça coince pour moi... Je ne vois pas pourquoi...

    Au fait, merci pour ces réponses rapides, c'est vraiment bien de voir l'entraide sur les forums même pour des sujets moins stimulants  :p

    Ma


  • mpergandmpergand Membre
    21:54 modifié #5
    Et si tu fais :

    NSLog(@%@",[tableau tableau]);

    ça donne quoi ?

    Moi, je sais  :)
  • ThibautThibaut Membre
    21:54 modifié #6
    Il manque l'initialisation du tableau dans objetMaster.m
    - (id) init<br />{<br />	self = [super init];<br />	if (self != nil) {<br />		tableau = [[NSMutableArray alloc] init];<br />	}<br />	return self;<br />}
    


    Problème de mémoire dans objetMini.m
    - (void)importerChampsDeTexte:(NSString*)champs{<br />	if (champsDeTexte != champs) {<br />		[champsDeTexte release];<br />		champsDeTexte = [champs retain];<br />	}<br />}
    
  • MaMa Membre
    21:54 modifié #7
    D'haaa.... Merci pour votre aide!

    Ma
  • ThibautThibaut Membre
    21:54 modifié #8
    Problème mémoire également ici :
    -(void)creerTableau{<br />	objetMaster *tableau = [[objetMaster alloc]init];<br />	NSMutableArray *tableauLocal = [[NSMutableArray alloc] init];<br />	int i;<br />	for(i=0;i&lt;=29;i++){<br />		NSString *Nouvelle = @&quot;Test&quot;;&nbsp;  <br />		objetMini *objet = [[objetMini alloc]init];<br />		[objet importerChampsDeTexte:Nouvelle];<br />		[tableau ajoutTableau:objet];<br />		[tableauLocal addObject:objet];<br />		[objet release];<br />	}<br />	NSLog(@&quot;%@&quot;,[tableau tableau]);<br />	NSLog(@&quot;%@&quot;,tableauLocal);<br />&nbsp; &nbsp; <br />	[tableau release];<br />	[tableauLocal release];<br />}
    
Connectez-vous ou Inscrivez-vous pour répondre.