如何使用NSUserDefaults存储容器类

时间:2013-10-04 13:28:39

标签: ios cocoa-touch nsuserdefaults

我正在尝试在NSUserDefaults键下存储一组值。我使用自定义类来访问RSS提要并设置类的变量以匹配在提要中找到的信息。然后我使用另一个类在NSUserDefaults键下设置值:

[infoStorageClass dataIsNew:self];
[infoStorageClass storeData:self];

问题在于每当我存储课程时,我都会收到此警告:

  

[NSUserDefaults setObject:forKey:]:尝试插入非属性值'(       “TARSSInfo:0x80eb6a0”   )''class'_NSArrayM'。请注意,属性列表中的字典和数组也必须仅包含属性值。

这里发生了什么?在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

来自文档:

默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。

为了存储另一种类型的对象,首先需要在要存储的对象的类中实现NSCoding协议。这意味着实现这些方法,并像这样进行解码和编码(我自己的自定义类BMDifficultyLevel代码片段):

- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
    _difficultyLevel = [decoder decodeObjectForKey:@"difficulty"];
    _difficultyLevelType = [decoder decodeIntegerForKey:@"type"];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:_difficultyLevel forKey:@"difficulty"];
[encoder encodeInteger:_difficultyLevelType forKey:@"type"];
}

然后在存储您的对象之前,您需要存档,然后像这样存储:

 NSUserDefaults *defaults = [[NSUserDefaults alloc] init];
_defaultsDataWithLevelObject = [NSKeyedArchiver archivedDataWithRootObject:_difficultyLevel];
[defaults setObject:_defaultsDataWithLevelObject forKey:BMDifficultyLevelDefaultsKey];

其中_defaultsDataWithLevelObject是NSData类型的对象,这意味着最终存储NSData对象。

要检索默认值,您需要将对象解压缩,如下所示:

    _defaultsDataWithLevelObject = [[NSUserDefaults standardUserDefaults] objectForKey:BMDifficultyLevelDefaultsKey];
    _difficultyLevel = [NSKeyedUnarchiver unarchiveObjectWithData:_defaultsDataWithLevelObject];

答案 1 :(得分:1)

您应该使自定义类实现NSCoding协议,然后归档您的实例数组。这将为您提供一个NSData实例,您可以将其存储到用户默认值中。