我正在尝试在NSUserDefaults键下存储一组值。我使用自定义类来访问RSS提要并设置类的变量以匹配在提要中找到的信息。然后我使用另一个类在NSUserDefaults键下设置值:
[infoStorageClass dataIsNew:self];
[infoStorageClass storeData:self];
问题在于每当我存储课程时,我都会收到此警告:
[NSUserDefaults setObject:forKey:]:尝试插入非属性值'( “TARSSInfo:0x80eb6a0” )''class'_NSArrayM'。请注意,属性列表中的字典和数组也必须仅包含属性值。
这里发生了什么?在此先感谢您的帮助。
答案 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
实例,您可以将其存储到用户默认值中。