无法从NSUserDefaults

时间:2016-02-13 21:51:07

标签: objective-c nsuserdefaults nsnumber

在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]);

这记录“在ViewControllerB中,按下btn:test 1”。

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

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

此日志“在ViewControllerB中,btn按下:test2 1”

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

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

此日志“在ViewControllerB中,btn按下:测试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]);

这会记录“defaultsTest中的phaseIsKnownNSNum:0”。

设置断点并检查phaseIsKnownNSNum的值,它是零。

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

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

这会记录“phaseIsKnownNSNum from defaults:0”。

设置断点并检查phaseIsKnownNSNum的值,它仍然是零。

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

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

1 个答案:

答案 0 :(得分:1)

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

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