Attempt to insert non-property value Objective C

ios, nsmutablearray, nsuserdefaults, objective-c, property-list

Solution

If you don't want to bother about ensuring all your dictionary values are the property list types, then you can simply convert the dictionary into NSData,

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary] forKey:@"MyData"];
[def synchronize];

And to get back into a dictionary from sandbox:

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSData *data = [def objectForKey:@"MyData"];
NSDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];
self.myDictionary = [[NSDictionary alloc] initWithDictionary:retrievedDictionary];

Hope this helps someone. :D

ADDITIONAL NOTE: If you are getting a mutable dictionary, or mutable array, then remember to use "mutableCopy" method. Otherwise you can't add or delete objects from your retrieved dictionary/array. For example:

NSMutableDictionary *retrievedDictionary = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy];

Or

NSMutableArray *retrievedArray = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy];

Problem

Hi l am trying to create a fourates lists from an restaurants Object, my application has a list of different restaurants, l want the ability for users to add favourate restaurants, and this code is not working ``` - (IBAction)toggleFav:(id)sender { Restaurant *resto = [self restaure]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; [dic setObject:resto.price forKey:@"restoPrice"]; [dic setObject:resto.restaurantId forKey:@"restaurantId"]; [dic setObject:resto.restoAbout forKey:@"restoAbout"]; [dic setObject:resto.restoAddress forKey:@"restoAddress"]; [dic setObject:resto.restoBeverages forKey:@"restoBeverages"]; [dic setObject:resto.restoCategory forKey:@"restoCategory"]; [dic setObject:resto.restoEmail forKey:@"restoEmail"]; [dic setObject:resto.restoLogo forKey:@"restoLogo"]; [dic setObject:resto.restoName forKey:@"restoName"]; [dic setObject:resto.restoPhone forKey:@"restoPhone"]; [dic setObject:resto.restoCity forKey:@"restoCity"]; NSArray *dicArray = [dic allKeys]; if([sender isSelected]){ //... [sender setSelected:NO]; NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; [array removeObject:dicArray]; [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; } else { //... [sender setSelected:YES]; NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; [array addObject:dicArray]; [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; [[NSUserDefaults standardUserDefaults] synchronize]; //NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"restoName"]); } } ``` ' of class '__NSCFArray'. Note that dictionaries and arrays in property lists must also contain only property values.

Original source