将NSMutableArray存储到NSUserDefaults

时间:2013-12-25 12:32:26

标签: objective-c nsmutablearray nsuserdefaults

首先:祝大家圣诞快乐!我已经有一段时间能够将数据存储到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。

有人知道我搞砸了吗?

4 个答案:

答案 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表示。

对于少数参数,最佳选择是CoreDataNSKeyedArchiver保存到Documents目录中的文件。

答案 3 :(得分:0)

您的两个选择是:

  1. MyObject中实施NSCoding,然后使用NSKeyedArchiver

  2. 使用CoreData

  3. 一个非常好的教程和两者的比较可以在这里找到:http://nshipster.com/nscoding/