如何将我的客户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
存储NSMutableArray
为Objective-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:
您可以存储阵列通过以下方式自定义对象
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
嗨,我试着在上面编辑,但它崩溃了。我错过了什么吗? – Wun
你是否实现了initWithCode方法? –
请注意,即使将可变对象设置为值,“从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"];
http://*.com/questions/19720611/attempt-to-set-a -non-property-list-object-as-an-nsuserdefaults – aNa12