Jeshua Lacock
Jeshua Lacock

Reputation: 6668

Saving plain NSArray with NSNumbers

I am stumped here. I am just trying to save an NSArray populated with either NSNumbers or NSStrings to NSUserDefaults. Weird thing is it works if I save it right before I read it - but if I don't save it and read it (after it has been saved on a prior launch) it is nil. It is like the defaults are being wiped out each time I hit Run (Command-R) in XCode.

NSArray *arrayToSave = [NSArray arrayWithObjects: [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil];
[[NSUserDefaults standardUserDefaults] setObject:arrayToSave forKey:@"TestKey"];  //if I comment this line arrayRead will be nil even after I had saved it with this line on a prior run

Read it:

NSArray *arrayRead = [[NSUserDefaults standardUserDefaults] objectForKey: @"TestKey"];
NSLog(@"arrayRead: %@", arrayRead);

Upvotes: 0

Views: 778

Answers (2)

sch
sch

Reputation: 27506

You should call synchronize after writing to user defaults:

// Write
NSArray *arrayToSave = [NSArray arrayWithObjects: [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil];
[[NSUserDefaults standardUserDefaults] setObject:arrayToSave forKey:@"TestKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

// Read
NSArray *arrayRead = [[NSUserDefaults standardUserDefaults] objectForKey:@"TestKey"]; // or arrayForKey
NSLog(@"arrayRead: %@", arrayRead);

Upvotes: 2

Mick Walker
Mick Walker

Reputation: 3847

Try the following:

Save:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *arr = ... ; // set value 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
[defaults setObject:data forKey:@"TestKey"]; 

Load:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [defaults objectForKey:@"TestKey"]; 
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Upvotes: 0

Related Questions