views:

161

answers:

1

I've read and watched many tutorials on NSUserDefaults in the iPhone OS/iOS SDK, but I can't seem to get my own implementation working.

Right now, I'm building a simple counting application that I'd like to have load the last counted number when the application loads. However, NSUserDefaults has a different idea in mind. Does anyone know why my preference loading method keeps returning (null) in an NSLog?

Thanks in advance! :)

CounterViewController.m (abridged)

- (void)viewDidLoad {

// yadda yadda yadda interface setup here...

    if ([self retrieveCount] == 0) {
        count = 0;
    } else {
        count = [self retrieveCount];
        NSString *temp = [[NSString alloc] initWithFormat:@"%@", count];
        [label setText:temp];
        [temp release];
    }


    [super viewDidLoad];
}

int count = 123; //whatever it might be when the user exits the application, set every time the "+" or "-" is tapped

- (void)writeCount {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    [prefs setInteger:count forKey:@"countKey"];
    [prefs synchronize];

}

- (int)retrieveCount {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    [prefs synchronize];
    int loaded = [prefs integerForKey:@"countKey"];
    NSLog(@"%@", loaded);
    return loaded;
}

CounterAppDelegate.m

- (void)applicationWillTerminate:(UIApplication *)application {
    /*
     Called when the application is about to terminate.
     See also applicationDidEnterBackground:.
     */
    [CountrViewController writeCount];
}

(Since I'll only be retrieving a value from one key, I decided to not have any input into the method.)

If this is confusing in any way, please let me know! I'll be glad to provide clarification.

+3  A: 

First off, you don't need to call -synchronize before you read from the defaults, only after you've written to them. Your NSLog may actually be the culprit here—try %d rather than %@. %@ is for printing objects, like an NSString or an NSNumber; an int is a primitive type.

Noah Witherspoon
Thanks a lot!!!
esqew
As a side note, synchronize is automatically called at periodic intervals, it's so reliable I haven't ever called it, but to be save I would call it once before the application terminates.
Alex Gosselin