【问题标题】:How to use NSUserDefaults to store a container class如何使用 NSUserDefaults 存储容器类
【发布时间】:2013-10-04 13:28:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios cocoa-touch nsuserdefaults


    【解决方案1】:

    来自文档:

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

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

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

    【讨论】:

    • 好的,感谢您的回答。我认为将我的值存储在一个数组中,然后存储它可能对我来说更容易。
    • 我将所有值(NSDate、2 个 NSNumber 和一个 CLLocation)存储在一个 NSDictionary 中,我将其存储在一个 NSMutable 数组中,该数组存储在 NSUserDefaults 中。我犯了同样的错误。 :{
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多