bug NSUserPreferences ?

jannold2

Membre confirmé
11 Avril 2007
55
0
39
Bonjour,
j'ai un mal fou avec les user preferences, j'y aurai passé mon dimanche, même si la doc semble claire sur le sujet... ici ca foire. J'ai remonté le probleme à la source, tout au début dansla méthode initialize de la classe. Et... je ne comprends pas le résultat de ce petit bout de code

Bloc de code:
    NSUserDefaults *preferences = [[NSUserDefaults standardUserDefaults] retain];
    NSDictionary * values=[NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:184],@"nombre",
                                  [NSNumber numberWithBool:YES],@"ouiounon",
                                  @"coucou",@"chaine", nil];
    [preferences registerDefaults:values];
    
    [preferences synchronize];
    
    NSLog(@"initPref\n");
    NSString* s = [preferences stringForKey: @"chaine"];
    int a = [preferences integerForKey: @"nombre"];
    Boolean b = [preferences boolForKey: @"ouiounon"];
    NSLog(@"et... %d %d %s\n",a, b, s);
ca affiche "184 1 unecroix unecroix" (une espece de croix en fait)

si quelqu'un peut m'expliquer pourquoi ca marche avec les entiers mais pas avec les chaines... et comment faire pour régler ce probleme

P.S j'ai tenté
Bloc de code:
NSString* aa = @"coucou";
et dans le dico : [aa retain] au lieu de @"coucou", et aussi juste aa
mais ca n'a pas marché non plus (au cas où avant la chaine aurait été supprimée de la mémoire)

merci d'avance
Thomas
 
j'ai un mal fou avec les user preferences, j'y aurai passé mon dimanche, même si la doc semble claire sur le sujet... ici ca foire. J'ai remonté le probleme à la source, tout au début dansla méthode initialize de la classe. Et... je ne comprends pas le résultat de ce petit bout de code

Bloc de code:
[COLOR=Black]     NSUserDefaults *preferences = [[NSUserDefaults standardUserDefaults] retain];[/COLOR]
[COLOR=Black]     NSDictionary * values=[NSDictionary dictionaryWithObjectsAndKeys:[/COLOR]
[COLOR=Black]                                   [NSNumber numberWithInt:184],@"nombre",[/COLOR]
[COLOR=Black]                                   [NSNumber numberWithBool:YES],@"ouiounon",[/COLOR]
[COLOR=Black]                                   @"coucou",@"chaine", nil];[/COLOR]
[COLOR=Black]     [preferences registerDefaults:values];[/COLOR]

[COLOR=Black]     [preferences synchronize];[/COLOR]

[COLOR=Black]     NSLog(@"initPref\n");[/COLOR]
[COLOR=Black]     NSString* s = [preferences stringForKey: @"chaine"];[/COLOR]
[COLOR=Black]     int a = [preferences integerForKey: @"nombre"];[/COLOR]
[COLOR=Black]     Boolean b = [preferences boolForKey: @"ouiounon"];[/COLOR]
[COLOR=Black]     NSLog(@"et... %d %d %s\n",a, b, s);[/COLOR]
ca affiche "184 1 unecroix unecroix" (une espece de croix en fait)

si quelqu'un peut m'expliquer pourquoi ca marche avec les entiers mais pas avec les chaines... et comment faire pour régler ce probleme

P.S j'ai tenté
Bloc de code:
[COLOR=Black] NSString* aa = @"coucou";[/COLOR]
[COLOR=Black] et dans le dico : [aa retain] au lieu de @"coucou", et aussi juste aa[/COLOR]
mais ca n'a pas marché non plus (au cas où avant la chaine aurait été supprimée de la mémoire)

merci d'avance
Thomas

il faut que tu sync pour sauvegarder ok -> copy
tu peux retain une value

NSString *str = [[standardUserDefaults stringForKey: @"chaine"] retain];
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
ne retain pas

et je te conseille de sync ton propre dict contenant tes valeurs tu le load une fois et le save une fois
le reste du temps tu travailles avec ton local dict
 
Merci. J'ai mis des retain partout... mais ça ne marche toujours pas :confused:
Bloc de code:
    NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
                                  
    NSString* aa = @"coucou";
    NSDictionary * values=[NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:184],@"nombre",
                                  [NSNumber numberWithBool:YES],@"ouiounon",
                                  [aa retain],@"chaine", nil];
    [values retain];
    [preferences registerDefaults:values];
    
    [preferences synchronize];
    
    NSString* s = [[preferences stringForKey: @"chaine"] retain];
    int a = [preferences integerForKey: @"nombre"];
    Boolean b = [preferences boolForKey: @"ouiounon"];
    NSLog(@"et... %d %d %s\n",a, b, [s retain]);

je me demande vraiment d'où ça peut venir...
 
Merci. J'ai mis des retain partout... mais ça ne marche toujours pas :confused:je me demande vraiment d'où ça peut venir...
Bloc de code:
   [COLOR=Red]NSUserDefaults *preferences;[/COLOR]

   preferences = [NSUserDefaults standardUserDefaults];
                                  
    NSString* aa = @"coucou";
    NSDictionary * values=[NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:184],@"nombre",
                                  [NSNumber numberWithBool:YES],@"ouiounon",
                                  [aa retain],@"chaine", nil];
    [values retain];
    [preferences registerDefaults:values];
    
    [preferences synchronize]; -> release all 
    
    [COLOR=Red]preferences = [NSUserDefaults standardUserDefaults];[/COLOR]

    NSString* s = [[preferences stringForKey: @"chaine"] retain];
    int a = [preferences integerForKey: @"nombre"];
    Boolean b = [preferences boolForKey: @"ouiounon"];
    NSLog(@"et... %d %d %s\n",a, b, [s retain]);
Bloc de code:
@interface MyPreferencesManager : NSObject {}
      -(BOOL) addValue:(id)obj forKey:(NSString *)key;
      -(BOOL) delValue:(NSString *)key;
      -(id) getValue:(NSString *)key;
      -(BOOL) saveAll:(id)obj forKey:(NSString *)key;
@end

-(BOOL) addValue:(id)obj forKey:(NSString *)key {
   NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; ....
}

-(BOOL) getValue:(NSString *)key {
   NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; ....
}
si tu travaillais avec ton propre dictionaire locale tu n'aurais pas ces problemes de mauvaise utilisations
de NSUserDefaults
 
ça ne marche toujours pas...
qu'est ce que tu entends par "utilise ton propre dictionnaire local" ?
merci en tout cas d'essayer de m'aider
 
ça ne marche toujours pas...
qu'est ce que tu entends par "utilise ton propre dictionnaire local" ?
merci en tout cas d'essayer de m'aider
Bloc de code:
#define kMYPreferencesKey @"APPLICATION_PREFERENCES"

@interface MyPreferencesManager : NSObject {

@private
    NSMutableDictionary *MY_preferences;
}

- (BOOL)load;
- (BOOL)save;
- (BOOL)hasKey:(NSString *)key;
- (BOOL)addValue:(id)obj forKey:(NSString *)key;
- (BOOL) delValue:(NSString *)key;
- (id)getValue:(NSString *)key;

@end

- (BOOL) load {
    id load;
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
    if (nil != (load = [userDefaults objectForKey:kMYPreferencesKey]))
        //copy
    else
        //init with capacity
    
    
}

- (BOOL) save {
    // setObject:(id)value forKey:(NSString *)defaultName
}

- (BOOL) hasKey:(NSString *)key 
{    
    if (nil != ([MY_preferences valueForKey:key]) {
        return YES; }
    return NO;
}

-(BOOL) addValue:(id)obj forKey:(NSString *)key {
    if ([key isEqualToString:kMYPreferencesKey])
        return NO;
    [self setValue:key];
    if ([self hasKey:key]) {
        return YES; }
    return NO;
}

- (BOOL)setValue:(id)obj forKey:(NSString *)key {
    if ([key isEqualToString:kMYPreferencesKey])
        return NO;
    [MY_preferences setObject:obj forKey:key];
    if ([self hasKey:key]) {
        return YES; }
    return NO;
}

- (id)getValue:(NSString *)key {
    if ([key isEqualToString:kMYPreferencesKey])
        return NO;
      [MY_preferences valueForKey:key];
}

- (BOOL)delValue:(NSString *)key {
    if ([key isEqualToString:kMYPreferencesKey])
        return NO;
    [MY_preferences removeObjectForKey:key];
    if ([self hasKey:key]) {
        return NO; }
    return YES;
}