在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