iphone - 为什么 NSUserDefaults 无法保存 NSMutableDictionary?

标签 iphone ios xcode nsuserdefaults nsmutabledictionary

我正在尝试使用 NSUserDefaults 保存一个 NSMutableDictionary。我在 stackoverflow 中阅读了很多关于该主题的帖子...我还找到了一个可行的选项;然而不幸的是它只工作了一次然后它开始只保存(null)。 有人有提示吗?

谢谢

要保存的代码:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:dictionary] forKey:@"Key"];
[[NSUserDefaults standardUserDefaults] synchronize];

要加载的代码:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];
NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

将对象添加到 NSMutableDictionary 的代码:

[dictionary setObject:[NSNumber numberWithInt:0] forKey:@"Key 1"];
[dictionary setObject:[NSNumber numberWithInt:1] forKey:@"Key 2"];
[dictionary setObject:[NSNumber numberWithInt:2] forKey:@"Key 3"];

NSLog() 值的代码:

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %i", key, [[dictionary objectForKey:key]integerValue]);
}

而且键是(null):

NSLog(@"%@"[dictionary allKeys]);

最佳答案

来自 Apple 的 NSUserDefaults objectForKey 文档:
返回的对象是不可变的,即使您最初设置的值是可变的。

行:

dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

丢弃之前创建的 NSMutableDictionary 并返回一个 NSDictionary

将加载更改为:

NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

完整的例子,本例也不需要使用NSKeyedArchiver:

NSDictionary *firstDictionary = @{@"Key 4":@4};
[[NSUserDefaults standardUserDefaults] setObject:firstDictionary forKey:@"Key"];

NSMutableDictionary *dictionary = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"] mutableCopy];

dictionary[@"Key 1"] = @0;
dictionary[@"Key 2"] = @1;
dictionary[@"Key 3"] = @2;

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

NSLog输出:
键:键2,值:1
键:键1,值:0
键:键4,值:4
键:键 3,值:2

关于iphone - 为什么 NSUserDefaults 无法保存 NSMutableDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14105415/

相关文章:

iphone - 定位 UIScrollView

android - 我可以构建一个在所有手机上都兼容的 Web 应用程序吗?

iphone - 触摸时 UIScrollView 使应用程序崩溃

ios - 模拟器和设备之间的应用程序内存使用差异

ios - iOS 上的 std::thread

ios - UIView+Category 访问 dealloc 或对 UIView dealloc 调用做一些事情

android - React Native Video 不显示播放器

ios - iOS 中长时间运行的后台任务

ios - 解析 JSON iOS-Swift

ios - 在 ios 中的 imageView 中显示来自路径的图像