# Enregistrer un NSMutableArray dans un fichier



## marcelo (22 Mars 2011)

Bonjour,
J'ai une NSNotification qui est envoyée et qui appelle la méthode "didReceiveNavData" qui stock dans un NSMutableArray l'objet envoyé par cette notification avec pour clé "nav" ensuite ce que je n'arrive pas à faire, dans un premier temps, c'est afficher le contenu de ce NSMutableArray pour ensuite dans un deuxième temps l'enregistrer dans un fichier.


notification envoyée :



> [[NSNotificationCenter defaultCenter] postNotificationName"NavDataNotification" object:nil userInfo:[NSDictionary dictionaryWithObject:[data hexdump] forKey"nav"]];



méthode appelée par la notification dans la classe NavTransaction :



> - (void)didReceiveNavDataNSNotification *)notification
> {
> DLog(@"didReveiveNavData");
> [trames addObject:[notification.userInfo objectForKey"nav"]];
> ...



ma méthode pour enregistrer dans la classe NavSave :



> - (void)saveText
> {
> transaction = [[NavTransaction alloc] init];
> transaction.delegate = self;
> ...



En faisant un DLog(@"count : %@", [transaction.trames count]); j'obtient NULL ce qui veut dire que je récupère un tableau vide.
En faite le problème vient de la récupération de l'objet je pense...

Merci pour toute aide


----------



## marcelo (22 Mars 2011)

Bon je peux plus éditer mon message dommage bref... Mon problème d'après ce que j'ai compris c'est la récupération de mon objet à partir d'une autre classe pour cela je dois utiliser un getter/setter? 
je ne sais vraiment pas comment faire en objective c :sick: , en c++ oui mais là... si quelqu'un peut m'éclaircir la chose 
merci


----------



## ntx (22 Mars 2011)

RTFM


----------



## marcelo (23 Mars 2011)

ok je vais regarder sa


----------



## marcelo (23 Mars 2011)

j'arrive pas à trouver se dont j'ai besoin je m'y remet demain... :sleep:


----------



## marcelo (24 Mars 2011)

je suis vraiment bloqué d'après ce que j'ai compris il faut utiliser les accesseurs mais je n'arrive toujours pas :

En simplifié j'ai dans NavTransaction.h :


> @interface NavTransaction : NSObject
> {
> NSMutableArray *trames2;
> }
> @property (copy) NSMutableArray *trames2;



NavTransaction.m :


> @implementation NavTransaction
> @synthesize trames2;
> 
> trames2 = [[NSMutableArray alloc] init];
> [trames2 addObject"Test"];



Et dans NavSave là je vois pas bien ce qu'il faut mettre pour l'instant j'ai pour NavSave.h :


> #import "NavTransaction.h"
> @interface NavSave : NSObject
> {
> NavTransaction *transaction;
> }



Dans NavSave.m :


> @implementation NavSave
> @synthesize transaction;
> - (void)saveText
> {
> ...


----------



## tatouille (24 Mars 2011)

tu nous as dit que tu savais faire ca en c++ :rateau: c'est un peu du pipo dis moi,
parce que la ce sont les bases de l'objet, initialization d'un membre de class / setting/getting (allocation) un membre de class, 

ce serait la meme chose en python, php, smalltalk, java, C# et j'en passe  la seule difference c'est q'obj-c est context "aware" self peut referer a un context static comme dynamique, chose que tu retrouves en python ou ruby par exemple, 

et tu n'as toujours pas lu l'introduction a l'obj-c c'est a dire imprimer le PDF et lu serieusement ou alors l'obj-c le c++ ecetera sont des choses bien trop compliquées pour toi, acquiere les bases avec un language de script comme php par exemple, assez simple empreintant la meme synthax et les bases de l'objet CF un container class, puis fait du C, then reviens a la l'obj-c.

Parfois :mouais: je me demande bien pourquoi les nouibs essayent de nous vendret des histoires a propos de tel ou tel truc ou connaissance, surtout dans ce genre de situation ridicule...  gardez vos flutiaux rangés dans le placard  vous nous faites marrer,  assumer votre condition humaine, travailler plus, il y a un manque de travail personel flagrant, tu ne mets meme pas la charette avant les boeufs, dans ton cas, la charette n'est meme pas construite et les boeufs ne sont pas nés, quand on veut''', il faut commencer par s'en donner les moyens.


----------



## marcelo (25 Mars 2011)

ok merci de ton aide précieuse si c'est pour me dire sa autant ne pas me répondre du tout et me laisser ne pas comprendre un point de ce langage... et oui en C++ je sais faire un getter/setter mais bon on ne peut pas tous apprendre un langage parfaitement lorsqu'on est en projet avec un temps limité et pleins d'autres choses à faire à coté en gros je ne peux pas me permettre de rester à apprendre l'objective c 24/24 ce que j'aimerais mais c'est la dure lois des études bon je vais me replonger dans la doc.
si quelqu'un à l'amabilité de m'expliquer et non résoudre mon problème je serrait reconnaissant


----------



## ntx (25 Mars 2011)

Les concepts de la programmation objet sont indépendants du langage utilisé. Donc si tu ne parviens pas à utiliser de getter/setter en Obj-C, c'est que tu ne dois pas tout avoir compris de la POO. Car l'apprentissage de l'Obj-C, comme s'en vantait Apple, c'est un après-midi ... à condition d'avoir les bases nécessaires, et toi tu ne les a pas.


----------



## marcelo (29 Mars 2011)

Bon je tente une dernière fois si quelqu'un peut m'expliquer se qu'il ne va pas toujours pour récupérer mon NSMutableArray avec un accesseur je galère vraiment malgré la doc :mouais:

NavTransaction.h

```
@interface NavTransaction : NSObject 
{
NSMutableArray *trames;
}
@property (nonatomic, retain) NSMutableArray *trames;
- (NSMutableArray *) trames;
```
NavTransaction.m

```
#import "NavTransaction.h"
@interface NavTransaction()
@end
@implementation NavTransaction
@synthesize trames;

- (void)didReceiveNavData:(NSNotification *)notification
{
    DLog(@"didReveiveNavData");
    [trames addObject:[notification.userInfo objectForKey:@"nav"]];

    if ([delegate respondsToSelector:@selector(transaction:didReceiveNavData:)]) {
        [delegate transaction:self didReceiveNavData:[trames lastObject]];
    }
}

- (NSMutableArray *)trames
{
    return trames;
}
```
NavSave.h

```
#import "NavTransaction.h"
@interface NavSave : NSObject 
{    
    NavTransaction *transaction;
    
    NSString *file;
    NSArray *path;
    NSString *directory;
    NSString *finalFile;
}
- (void) saveText;
@end
```
NavSave.m

```
@implementation NavSave

- (void)saveText
{
    transaction = [[NavTransaction alloc] init];
    NSMutableArray *trame = [transaction trames];
    //NSMutableArray *trame = transaction.trames;

    path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        
    directory = [path objectAtIndex:0];
    file = @"NavSave";
    
    finalFile = [directory stringByAppendingPathComponent:file];
    
    [trame writeToFile:finalFile atomically:YES]; 
}
```


----------



## Nyx0uf (29 Mars 2011)

http://developer.apple.com/library/...ceptual/ObjectiveC/Chapters/ocProperties.html


----------



## marcelo (29 Mars 2011)

j'ai du mal, donc si je veux uniquement lire je dois utiliser 

@property(readonly, getter=getTrames) NSMutableArray *trames;

et pour l'implémentation

- (NSMutableArray *) getTrames
{
return trames;
}


----------



## Nyx0uf (29 Mars 2011)

```
@property (readonly) NSArray* trames;

NSArray* bla = obj.trames; // ou [obj trames];
```


----------



## marcelo (29 Mars 2011)

j'ai essayé les 2 solutions et sa ne marche pas...
si j'ai bien compris le @property (readonly) NSMutableArray *trames; est équivalent à la déclaration des méthodes get/set et le @synthesize trames; est équivalent à l'implémentation des méthodes get/set donc là ou je veux récupérer je crée une instance NNavTransaction *transaction = [[NavTransaction alloc] init]; et je récupère soit par la méthode soit par l'attribut : NSMutableArray *trame = [transaction trames]; ou NSMutableArray *trame = transaction.trames;


----------



## tatouille (29 Mars 2011)

Nyx0uf a dit:


> ```
> @property (readonly) NSArray* trames;
> 
> NSArray* bla = obj.trames; // ou [obj trames];
> ```



nice try!
 on a deja essayé ca ne marche pas


----------

