Sauvegarde dans les Preferences

macvelottemacvelotte Membre
00:33 modifié dans API AppKit #1
NSNumber *memo;
NSMutableArray *memoires;
memoires=[[NSMutableArray alloc] init];
memo=[[NSNumber alloc] initWithDouble :M1];
[memoires addObject:memo];
memo=[[NSNumber alloc] initWithDouble :M2];
[memoires addObject:memo];
[[NSUserDefaults standardUserDefaults] setObject:memoires forKey:@Memoires];
[memoires release];
Ce code permet de mettre dans UsersDefaults les quantité M1 et M2 .
On rappelle par :
NSMutableArray *mem;
mem=[[NSMutableArray alloc] init];
mem=[[NSUserDefaults standardUserDefaults] arrayForKey:@Memoires];
M1 = [(NSNumber *)[mem objectAtIndex:0] doubleValue];
M2= [(NSNumber *)[mem objectAtIndex:1] doubleValue];
[mem release];

Je refais dans une autre application ce code  pour un rappel (les noms des paramètres ont changé) :

NSMutableArray *mem;
mem=[[NSMutableArray alloc] init];
mem=[[NSUserDefaults standardUserDefaults] arrayForKey:@Memoires];
latitude = [(NSNumber *)[mem objectAtIndex:0] doubleValue];
decalag= [(NSNumber *)[mem objectAtIndex:1] doubleValue];
[mem release];

réponse à  la compilation :  assignment from incompatible pointer type (pour la ligne mem =[[NSUserDefaults ....]

Je ne comprends pas que ça marche dans un cas et pas dans l'autre !

Réponses

  • 00:33 modifié #2
    Plusieurs remarques:
    - pour les NSNumber, utilise plutôt [NSNumber numberWithDouble:x] que less alloc init;
    - là  dedans:
    [tt] NSMutableArray *mem;
    mem=[[NSMutableArray alloc] init];
    mem=[[NSUserDefaults standardUserDefaults] arrayForKey:@Memoires];
    [mem release];[/tt]
    Il y a deux lignes en trop, tu peux supprimer la deuxième et la dernière. La deuxième est inutile, vu que "=" est une assignation d'un objet à  un pointeur, donc à  la deuxième tu crées un objet tableau, et tu fais pointer mem vers ce tableau vide. À la troisième, nsuserdefaults crées un nouveau tableau (et ne remplis pas mem avec!), placé dans l'autorelease pool, et  tu fais pointer ce tableau par mem. Le premier (vide) existe toujours, mais aucun pointeur ne pointe vers lui. Il ne sera jamais effacé de la mémoire tant que l'application est active. À la quatrième ligne, tu envoies release à  mem, c'est-à -dire le tableau revoyé par nsuserdefaults, et non celui que tu as créé.

    L'erreur de compilation provient du fait que tu alloues un NSArray à  un pointeur de type NSMutableArray. Le mieux au vu de ce que tu fais est d'utiliser NSArray pour mem.

    Le plantage est du au fait que tu envoies un message release à  un objet qui se trouve dans l'autorelease pool.
  • macvelottemacvelotte Membre
    00:33 modifié #3
    Merci renaud ... J'ai supprimé les lignes en question.
    Mais ça ne marche pas !

    Avec NSArray *mem; l'application plante au lancment.

    Avec NSMutableArray *mem :  assignment from incompatible pointer type  ....

    ?????
  • macvelottemacvelotte Membre
    00:33 modifié #4
    C'est une autre qustion : comment enregistrer dans NSUserDefaults une NSString  et comment la rappeler ?
  • BruBru Membre
    00:33 modifié #5
    dans 1106572802:

    Merci renaud ... J'ai supprimé les lignes en question.
    Mais ça ne marche pas !

    Avec NSArray *mem; l'application plante au lancment.

    Avec NSMutableArray *mem :  assignment from incompatible pointer type  ....

    ?????


    Le NSArray fourni par la méthode arrayForKey est en autorelease pool. Ca signifie que, si tu ne le retiens (retain) pas, il sera détruit automatiquement un peu plus tard.

    Or, tu le détruis à  la main par le [mem release].

    En conclusion, ce tableau sera détruit 2 fois, ce qui produira le plantage au second coup.

    Retire donc le release, et ça devrait marcher !

    .
  • BruBru Membre
    00:33 modifié #6
    dans 1106575287:

    C'est une autre qustion : comment enregistrer dans NSUserDefaults une NSString  et comment la rappeler ?


    Pour enregistrer, utilise :
    [tt]- (void)setObject:(id)value forKey:(NSString *)defaultName[/tt]

    exemple :
    <br />&nbsp; &nbsp; NSString *uneChaine;<br />&nbsp; &nbsp; uneChaine=[NSString stringWithString:@&quot;ceci est une chaine&quot;];<br />&nbsp; &nbsp; [[NSUserDefaults standardUserDefaults] setObject:uneChaine forKey:@&quot;chaineSauvegardée&quot;];<br />
    



    Et pour relire, utilise :
    [tt]- (NSString *)stringForKey:(NSString *)defaultName[/tt]

    exemple :
    <br />&nbsp; &nbsp; NSString *chaineSauvegardee;<br />&nbsp; &nbsp; chaineSauvegardee=[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;chaineSauvegardée&quot;];<br />
    


    .
Connectez-vous ou Inscrivez-vous pour répondre.