【问题标题】:NSUserDefaults setObject:forKey: attempt to insert non-property list objectNSUserDefaults setObject:forKey: 尝试插入非属性列表对象
【发布时间】:2014-06-04 20:18:35
【问题描述】:

我认为我在这里做的事情很明显是错误的,但我想不通!我正在尝试将包含 NSStrings 和 NSNumbers 和 NSBooleans 的 NSMutableDictionary 保存到 iOS 7.1 上的 NSUserDefaults 中。

这是字典定义:

- (NSMutableDictionary *)hotLevelsDict
{
    if ( (!_hotLevelsDict) || ([_hotLevelsDict count] < 1) )
    {
        _hotLevelsDict = [NSMutableDictionary dictionaryWithDictionary:
                          @{@100: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @50, @"complete": @NO}],
                            @200: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @100, @"complete": @NO}],
                            @500: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @200, @"complete": @NO}],
                            @1000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @200, @"complete": @NO}],
                            @2000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @500, @"complete": @NO}],
                            @5000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @10000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @20000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @10, @"points": @1000, @"complete": @NO}],
                            @50000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @100000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @200000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @300000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @400000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @500000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @600000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @700000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @800000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @20, @"points": @1000, @"complete": @NO}],
                            @900000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @5, @"points": @50000, @"complete": @NO}],
                            @950000: [NSMutableDictionary dictionaryWithDictionary:@{@"time": @2, @"points": @50000, @"complete": @NO}]
                            }];
    }

    return _hotLevelsDict;
}

并保存它:

[defaults setObject:self.hotLevelsDict forKey:@"hotLevelsDict"];

我已经尝试打印字典中所有子对象的类,它们都是标准的,我也在对另一个以非常相似的方式构建的字典做同样的事情,它工作正常。

有人能指出我的错误吗?

谢谢!

【问题讨论】:

    标签: ios objective-c dictionary nsuserdefaults


    【解决方案1】:

    在 plist 中,键必须是字符串。由于 NSUserDefaults 由 plist 支持,因此它强制执行该限制。

    作为旁注,我认为您使用[@{...} mutableCopy] 会更清楚。

    【讨论】:

    • 啊太棒了!谢谢! mutableCopy 也很棒,谢谢 :)
    • 我面临同样的问题。您能否澄清一下,是否可以使用 NSUserDefaults 将字典作为对象保存到字符串键?
    • @techsavvy 是的,您可以将字典作为值,但该字典中的每个键也必须是字符串。
    • @Kevin .. 基本上该字典中的每个键都必须有一个不属于 NSNull 类的值。我猜任何类型的值都足够了?
    • @techsavvy 否,请参阅允许的类型 here。基本上每个key都必须是NSString,value只能是NSString、NSNumber、NSDate、NSData或NSArray或NSDictionary,其中的所有对象都必须遵循相同的规则。
    【解决方案2】:

    NSUserDefault仅支持NSStringNSNumberNSDateNSArrayNSDictionaryBOOLNSIntegerNSFloat等基本数据类型。

    如果这些集合类型包含其他非系统数据类型,它们仍然会导致崩溃。如果包含自定义数据类型,则需要转换为NSData 存储。 This is my test demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      相关资源
      最近更新 更多