Sauvegarde dans les Preferences
macvelotte
Membre
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 !
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 !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
- 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.
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 !
.
Pour enregistrer, utilise :
[tt]- (void)setObject:(id)value forKey:(NSString *)defaultName[/tt]
exemple :
Et pour relire, utilise :
[tt]- (NSString *)stringForKey:(NSString *)defaultName[/tt]
exemple :
.