我有两个完全独立的任务正在执行,但它们似乎以某种方式联系在一起。
在 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"]);
将正常工作,但是您正在创建 defaults1
和 defaults2
,它们都是标准默认值的实例,因此:
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/