NSNumber 未从 NSUserDefaults 准确设置

NSNumber not being accurately set from NSUserDefaults

在 ViewControllerA 中,我设置如下:

NSNumber *phaseIsKnownNSNum = 1

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:phaseIsKnownNSNum forKey:@"Phase is Known"];
[defaults synchronize];

在 ViewControllerB 中,只要不使用相同的 "phaseIsKnownNSNum" 变量名,我就可以从用户默认值中提取此值。在 ViewControllerB 中按下按钮后发生以下情况:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//using 2 instances of the standardUserDefaults, just to be sure.
NSUserDefaults *defaultsTest = [NSUserDefaults standardUserDefaults];

NSNumber *testNum = [defaultsTest objectForKey:@"Phase is Known"];

NSLog(@"in ViewControllerB, btn pressed:  test %d", [testNum intValue]);

这会记录 "in ViewControllerB, btn pressed: test 1"。

NSNumber *testNum2 = [defaultsTest objectForKey:@"Phase is Known"];

NSLog(@"in ViewControllerB, btn pressed:  test2  %d", [testNum2 intValue]);

这记录了 "in ViewControllerB, btn pressed: test2 1"

testNum = [defaults objectForKey:@"Phase is Known"];

NSLog(@"in ViewControllerB, btn pressed:  test %d", [testNum intValue]);

这记录了 "in ViewControllerB, btn pressed: test 1"

当试图在 ViewControllerB 中使用 "phaseIsKnownNSNum" 时,我就没那么幸运了。

//I've tried not allocating & initializing.  Gives the same issue.
NSNumber *phaseIsKnownNSNum = [[NSNumber alloc] initWithInt:1];

NSLog(@"phaseIsKnownNSNum from initialized value:  %d", [phaseIsKnownNSNum intValue]);

此记录:"phaseIsKnownNSNum from initialized value: 1"

phaseIsKnownNSNum = [defaultsTest objectForKey:@"Phase Is Known"];

NSLog(@"phaseIsKnownNSNum from defaultsTest:  %d", [phaseIsKnownNSNum intValue]);

这会记录 "phaseIsKnownNSNum from defaultsTest: 0"。

设置断点查看phaseIsKnownNSNum的值为nil

phaseIsKnownNSNum = [defaults objectForKey:@"Phase Is Known"];

NSLog(@"phaseIsKnownNSNum from defaults:  %d", [phaseIsKnownNSNum intValue]);

这会记录 "phaseIsKnownNSNum from defaults: 0"。

设置断点查看phaseIsKnownNSNum的值,还是nil

重复使用相同的名称来存储和检索用户默认值是否存在问题?我知道简单的解决方案是使用不同的变量名。但是,此默认值在 ViewControllers C、D、E 中检索,...

NSNumber 变量名每次都必须不同是没有意义的。

您开始使用带有小写 i@"Phase is Known"。然后你用大写 I 切换到 @"Phase Is Known"。这显然不匹配,因此您不会检索保存的值。

您应该将每个 NSUserDefaults 键保存在某个地方的全局可访问常量中,这样您就不会出现这样的拼写错误。