Ce forum est en partie financé par l’affichage de publicités. Merci de désactiver votre bloqueur de publicités pour nous permettre de continuer à fournir ce service.

bug NSUserPreferences ?

Discussion dans 'Développement Mac' créé par jannold2, 31 Août 2008.

  1. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    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

    Code (Text):

        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é
    Code (Text):

    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
     
  2. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    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
     
  3. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    Merci. J'ai mis des retain partout... mais ça ne marche toujours pas :confused:
    Code (Text):

        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...
     
  4. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    Code (Text):

       [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]);
       
    Code (Text):

    @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
     
  5. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    ç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
     
  6. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    Code (Text):
    #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;
    }
     
Chargement...