首先:祝大家圣诞快乐!我已经有一段时间能够将数据存储到NSUserDefaults中。
在这种情况下,我想将NSMutableArray存储到NSUserDefaults。我很清楚,你只能将不可变对象存储到这个“文件”中。
我尝试了以下代码来加载NSMutableArray:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.mutableArray = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"TestKey"]];
我使用以下代码存储数据:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *tempArr = [NSArray arrayWithArray:self.mutableArray];
[defaults setObject:tempArr forKey:@"TestKey"];
[defaults synchronize];
不幸的是,模拟器退出时出现以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
"<MyObject: 0x10dfb40a0>"
) for key TestKey'
可变数组包含NSObjects。
有人知道我搞砸了吗?
答案 0 :(得分:3)
你可以试试这个:
归档:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:YOUR_MUTABLE_ARRAY]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myarray"]; [[NSUserDefaults standardUserDefaults] synchronize];
取消归档:
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myarray"]; NSMutableArray *mArr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
答案 1 :(得分:2)
您无法将tempArr保存到NSUserDefaults,因为正如您在注释中所示,此数组包含MyObject的子类,它是自定义对象。如果要将其保存到NSUserDefaults,则应实现NSCoding协议并添加两种方法:
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode all yours properties, vars
[encoder encodeObject:self.property1 forKey:@"property1"];
[encoder encodeObject:self.property2 forKey:@"property2"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
//decode all yours properties, vars
self.property1 = [decoder decodeObjectForKey:@"property1"];
self.property2 = [decoder decodeObjectForKey:@"property2"];
}
return self;
但是NSUserDefaults设计用于存储简单的数据,如果你想保存更多自定义对象,你应该考虑将它保存到文件中,看看NSKeyedArchiver可能会更适合你。请记住,如果你想用NSKeyedArchiver保存自定义对象,那么对象也应该符合NSCoding协议,你也必须在上面添加这两种方法。
答案 2 :(得分:1)
NSUserDefaults
无法处理自定义对象。
来自Apple文档:
默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何 在其他类型的对象中,通常应将其存档以创建 NSData的实例。
对于自定义对象,请转换为其中一个对象,或者为该类实现NSCoder
协议以创建NSData
表示。
对于少数参数,最佳选择是CoreData
或NSKeyedArchiver
保存到Documents目录中的文件。
答案 3 :(得分:0)
您的两个选择是:
在MyObject
中实施NSCoding,然后使用NSKeyedArchiver
使用CoreData
一个非常好的教程和两者的比较可以在这里找到:http://nshipster.com/nscoding/