1

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

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

问题是,每当我存储我的课程时,我都会收到以下警告:

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

这里发生了什么?提前感谢您的帮助。

4

2 回答 2

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];

where_defaultsDataWithLevelObject是 NSData 类型的对象,这意味着您最终会存储 NSData 对象。

要检索您的默认值,您需要像这样取消归档对象:

    _defaultsDataWithLevelObject = [[NSUserDefaults standardUserDefaults] objectForKey:BMDifficultyLevelDefaultsKey];
    _difficultyLevel = [NSKeyedUnarchiver unarchiveObjectWithData:_defaultsDataWithLevelObject];
于 2013-10-04T14:35:27.240 回答
1

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

于 2013-10-04T13:36:27.133 回答