Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSUserDefaults setObject:forKey:尝试插入非属性列表对象_Ios_Objective C_Dictionary_Nsuserdefaults - Fatal编程技术网

Ios NSUserDefaults setObject:forKey:尝试插入非属性列表对象

Ios NSUserDefaults setObject:forKey:尝试插入非属性列表对象,ios,objective-c,dictionary,nsuserdefaults,Ios,Objective C,Dictionary,Nsuserdefaults,我想我在这里做了一些非常明显的错误,但我不明白!我正试图在iOS 7.1上将包含NSString、NSNumber和NSBooleans的NSMutableDictionary保存到NSUserDefaults中 以下是字典的定义: - (NSMutableDictionary *)hotLevelsDict { if ( (!_hotLevelsDict) || ([_hotLevelsDict count] < 1) ) { _hotLevelsDict

我想我在这里做了一些非常明显的错误,但我不明白!我正试图在iOS 7.1上将包含NSString、NSNumber和NSBooleans的NSMutableDictionary保存到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;
}
我试着打印字典中所有子对象的类,它们都是标准的,而且我对另一个以非常相似的方式构造的字典也做了同样的事情,效果很好

有人能指出我的错误吗


谢谢

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


作为旁注,我认为使用
[{…}mutableCopy]
nsserdefault
只支持
NSString
NSNumber
NSDate
NSArray
NSDictionary
BOOL
NSInteger
NSFloat
和其他基本数据类型


如果这些收集类型包含其他非系统数据类型,它们仍然可能导致崩溃。如果包含自定义数据类型,则需要转换为
NSData
存储

啊,太棒了!谢谢还有一个关于mutableCopy的好提示谢谢:)我也面临同样的问题。您能否澄清一下,是否可以使用NSUserDefaults将字典作为对象保存到字符串键?@TechSavy是的,您可以将字典作为值,但该字典中的每个键也必须是字符串。@Kevin。。基本上,字典中的每个键都必须有一个非NSNull类的值。任何类型的值都可以满足我的猜测?@techsavy否,请参阅允许的类型。基本上,每个键都必须是NSString,值只能是NSString、NSNumber、NSDate、NSData或NSArray或NSDictionary,其中的所有对象都必须遵循相同的规则。
[defaults setObject:self.hotLevelsDict forKey:@"hotLevelsDict"];