如何将我的客户NSMutableArray存储在Objective-C的NSUserDefaults中?

问题描述:

我正试图将我的客户数据存储到NSUserDefaults。客户的数据是这样的:如何将我的客户NSMutableArray存储在Objective-C的NSUserDefaults中?

AvinLightInfo.h

#import <Foundation/Foundation.h> 
@interface AvinLightInfo : NSObject 

@property (nonatomic)uint16_t Address; 
@property (strong,nonatomic)NSString* name; 
@property (strong,nonatomic)NSMutableArray* ColorTempInfo; 
@property (strong,nonatomic)NSMutableArray* BrightnessInfo; 

@end 

view.m

NSMutableArray *AvinLightDataBase = [[NSMutableArray alloc] init]; 

AvinLightInfo *Avinlightinfo = [[AvinLightInfo alloc] init]; 
Avinlightinfo.Address = CFSwapInt16(0x3711); 
Avinlightinfo.name = @"TEST"; 

Avinlightinfo.ColorTempInfo = [[NSMutableArray alloc] init]; 
Avinlightinfo.BrightnessInfo = [[NSMutableArray alloc] init]; 
NSNumber* defaultValue = [NSNumber numberWithInt:200]; 
for(int j = 0 ; j < 4 ; j++){ 
    [Avinlightinfo.ColorTempInfo addObject:defaultValue]; 
    [Avinlightinfo.BrightnessInfo addObject:defaultValue]; 
} 
[AvinLightDataBase addObject:Avinlightinfo]; 

我尝试使用下面的代码来存储上述数据NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:AvinLightDataBase forKey:@"AvinLightDataBase"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

但它崩溃,并显示以下错误日志:

2016-12-27 16:35:23.491723 MESH[2458:992363] [User Defaults] Attempt to set a non-property-list object (
    "<AvinLightInfo: 0x1702414a0>" 
) as an NSUserDefaults/CFPreferences value for key AvinLightDataBase 
2016-12-27 16:35:23.492929 MESH[2458:992363] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "<AvinLightInfo: 0x1702414a0>" 
) for key AvinLightDataBase' 

如何在我的客户NSUserDefaults存储NSMutableArrayObjective-C

-------------------------编辑-------------------- -----------

我也试试下面的方法:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:AvinLightDataBase]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"light"]; 
[defaults synchronize]; 

但它崩溃,错误日志是:

-[AvinLightInfo encodeWithCoder:]: unrecognized selector sent to instance 0x17405c8c0 
2016-12-27 17:20:54.203510 MESH[2481:998134] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AvinLightInfo encodeWithCoder:]: unrecognized selector sent to instance 0x17405c8c0' 
*** First throw call stack: 
+0

http://*.com/questions/19720611/attempt-to-set-a -non-property-list-object-as-an-nsuserdefaults – aNa12

您可以存储阵列通过以下方式自定义对象

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"yourKey"]; 


NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"yourKey"]; 

更多的细节,你可以按照本Archiving Objective-C Objects with NSCoding

+0

嗨,我试着在上面编辑,但它崩溃了。我错过了什么吗? – Wun

+0

你是否实现了initWithCode方法? –

+0

请注意,即使将可变对象设置为值,“从NSUserDefaults返回的值也是不可变的。” [Apple Docs](https://developer.apple.com/reference/foundation/nsuserdefaults?语言= objc) 所以,如果你想找回原来的_NSMutableArray_,检索应该是这样的: '的NSMutableArray *阵列= [[NSKeyedUnarchiver unarchiveObjectWithData:默认objectForKey:@ “yourKey”] mutableCopy]'。 – degapps

NSUserDefault只能支持的NSNumber(NSInteger的,浮动,双),的NSString,NSDate的,的NSArray,NSDictionary的,BOOL, 所以,如果你想存储客户数据,您应该将客户数据转换为NSData,并且您的客户对象必须实现NSCoding,并覆盖encodeWithCoder和initWithCoder。

然后,请注意您的代码风格,变量将以小写字母开头。

使用此第三方RMMApper

要保存使用

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
[defaults rm_setCustomObject:AvinLightDataBase forKey:@"key"]; 

以检索

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableArray *object = [defaults rm_customObjectForKey:@"key"];