在NSUserDefaults中存储自定义对象

我试图存储自定义对象,如下所示,但我收到一个错误。

// store data NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:pOrderElements.count]; for (id orderObject in pOrderElements) { NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:orderObject]; [archiveArray addObject:personEncodedObject]; } NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; [userData setObject:archiveArray forKey:@"personDataArray"]; // retrive data NSData *data = [userData objectForKey:@"personDataArray"]; // the following line throws an error id retrieveData = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

这是我的pOrderElements

 (lldb) po pOrderElements ( { category = 1; imagePath = "products/chicken-kabob.png"; name = "Baked Chicken"; price = "5.49"; } ) 

因未捕获的exception’NSInvalidArgumentException’而终止应用程序,原因:’ – [__ NSCFArray bytes]:无法识别的选择器发送到实例0x174264f40′

您取消归档不正确的对象。 您将NSArray存储到NSUserDefaults

 NSArray * archiveArray = [userData objectForKey:@"personDataArray"]; for (NSData *personEncodedObject in archiveArray) { id personObject = [NSKeyedUnarchiver unarchiveObjectWithData:personEncodedObject]; } 

首先,您创建自定义类,如下所示。

CustomObject.h

 #import  @interface CustomObject : NSObject @property(strong,nonatomic)NSString *name; @end 

CustomObject.m

 #import "CustomObject.h" @implementation CustomObject - (void)encodeWithCoder:(NSCoder *)encoder { //Encode properties, other class variables, etc [encoder encodeObject:self.name forKey:@"name"]; } - (id)initWithCoder:(NSCoder *)decoder { if((self = [super init])) { //decode properties, other class vars self.name = [decoder decodeObjectForKey:@"name"]; } return self; } 

然后创建CustomObject类对象并存储在NSUserDefaults

像这样存储你的对象

 CustomObject *object =[CustomObject new]; object.name = @"test"; NSMutableArray *arr = [[NSMutableArray alloc]init]; [arr addObject:object]; NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:arr]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:encodedObject forKey:@"storeObject"]; [defaults synchronize]; 

NSUserDefaults获取自定义对象

 NSData *storedEncodedObject = [defaults objectForKey:@"storeObject"]; NSArray *arrStoreObject = [NSKeyedUnarchiver unarchiveObjectWithData:storedEncodedObject]; for (int i=0; i