1

我试图存储自定义对象,如下所示,但出现错误。将自定义对象存储在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 
<__NSArrayM 0x174256b90>(
{ 
    category = 1; 
    imagePath = "products/chicken-kabob.png"; 
    name = "Baked Chicken"; 
    price = "5.49"; 
} 
) 

终止应用程序由于未捕获的异常 'NSInvalidArgumentException' 的,理由是: ' - [__ NSCFArray字节]: 无法识别的选择发送到实例0x174264f40'

+2

[如何存储在定制对象NSUserDefaults的]的可能的复制(http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-在-nsuserdefaults) –

+0

我提到下面的答案,但我得到了错误http://stackoverflow.com/questions/19720611/attempt-to-set-a-non-property-list-object-as-an-nsuserdefaults – hotspring

+0

你有没有实现编码器解码器 –

回答

2

解开不正确的对象。您将NSArray存储为NSUserDefaults

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

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

CustomObject.h

#import <Foundation/Foundation.h> 

@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; 
} 

然后创建NSUserDefaults

CustomObject类对象和存储存储你的对象是这样

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<arrStoreObject.count; i++) 
    { 
     CustomObject *storedObject = [arrStoreObject objectAtIndex:i]; 
     NSLog(@"%@",storedObject.name); 

    } 
+0

它适合你或不适合。请告诉我@ hotspring –

相关问题