ios - NSUserDefaults 覆盖以前保存的值

标签 ios objective-c nsuserdefaults

我有两个完全独立的任务正在执行,但它们似乎以某种方式联系在一起。

在 ViewController 1 中,我有:

NSString *foo = @"foo";
NSUserDefaults *default1 = [NSUserDefaults standardUserDefaults]
[default1 setObject:foo forKey:@"foo"];
[default1 synchronize];

当我这样做的时候:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"foo"]);

打印的值是我期望的值。

在 ViewController 2 中,我有:

NSString *bar = @"bar";
NSUserDefaults *default2 = [NSUserDefaults standardUserDefaults]
[default2 setObject:bar forKey:@"bar"];
[default2 synchronize];

同样,当我对它进行 NSLog 时,它的值正是我所期望的。

但不知何故,当我再次尝试打印对象 @"foo" 时,它为我提供了第二个对象的值,在本例中为 @"bar"

关于为什么我的原始值被第二个值覆盖的任何指导,即使两个类中的变量/键名称不同?

最佳答案

你这样做是为了两者:

[foo setObject:bar forKey:@"bar"];

不应该是:

[defaults1 setObject:foo forKey:@"foo"];

[defaults2 setObject:bar forKey:@"bar"];

然而,还有一个更大的问题:

NSString *foo = @"foo";
NSUserDefaults *default1 = [NSUserDefaults standardUserDefaults];
[default1 setObject:foo forKey:@"foo"];
[default1 synchronize];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"foo"]);

NSString *bar = @"bar";
NSUserDefaults *default2 = [NSUserDefaults standardUserDefaults];
[default2 setObject:bar forKey:@"bar"];
[default2 synchronize];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"bar"]);

将正常工作,但是您正在创建 defaults1defaults2,它们都是标准默认值的实例,因此:

NSUserDefaults * defaults1 = [NSUserDefaults standardUserDefaults];
NSUserDefaults * defaults2 = [NSUserDefaults standardUserDefaults];
[NSUserDefaults standardUserDefaults];

都是指向standardUserDefaults 单例的指针。所以它们是相同的实例。你可以简单地做:

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];

NSString *foo = @"foo";
[standardDefaults setObject:foo forKey:@"foo"];
NSString *bar = @"bar";
[standardDefaults setObject:bar forKey:@"bar"];
[standardDefaults synchronize];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"foo"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"bar"]);

关于ios - NSUserDefaults 覆盖以前保存的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514118/

相关文章:

iphone - 如何使用NSJSONSerialization输出数据?

ios - ABAddressbook 记录删除通知

ios - 将 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 缓冲区转换为 RGB 缓冲区会创建蓝色图片

ios - shouldChangeCharactersInRange 从 UITextField 返回第二个字符

swift - UserDefaults 保存字符串 -> 尝试将非属性列表对象(函数)设置为 NSUserDefaults/CFPreferences

interface-builder - 使用 NSArrayController 添加对象时使 NSTableView 行可编辑

ios - 魔法记录,保存元素

iOS Swift 以编程方式设置 View 框架位置

iphone - 保存登录凭据 Xcode

iphone - 通过 NSUserDefaults 进行数据持久化