2012-09-26 48 views
0

我试图在NSUserDefaults中存储我的游戏的当前级别,但当我尝试将其转换为int时,它总是返回1。下面是测试代码:NSUserDefaults总是返回1而不是正确的整数

[[NSUserDefaults standardUserDefaults] setInteger:34 forKey:@"Current Level"]; 
    NSLog(@"default level raw: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"]); 
    self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue]; 
    NSLog(@"default level num: %i", self.levelNum); 

和输出:

default level raw: 34 
default level num: 1 
+0

什么是“'levelNum'”声明为? –

+0

levelNum被声明为int。 –

回答

5

只要确保呼吁NSUserDefaults的同步:

有关代码
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 

[defaults setInteger:34 forKey:@"Current Level"]; 
NSLog(@"default level raw: %@", [defaults objectForKey:@"Current Level"]); 

[defaults synchronize]; // Call synchronize after set 

self.levelNum = [defaults integerForKey:@"Current Level"]; 
NSLog(@"default level num: %i", self.levelNum); 
+2

它更好使用[默认值integerForKey:@“Current Level”]); –

+0

伟大的提示,谢谢!我逐字地粘贴了你的代码,它仍然给我34个原始数据和1个整数值。任何其他想法? –

+0

嗯..我试过代码,当然我不能复制你在说什么......其他任何东西(另一个线程)可能运行setInteger:1? – abellina

3

一件事是,你正在使用“setInteger”(这是一个NSInteger)

[defaults setInteger:34 forKey:@"Current Level"]; 

self.levelNum = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Current Level"] intValue] 

它假定您返回您从中读取的“int”(不一定是同样的事情为“NSInteger”)一个NSNumber的对象。

而不是第二个电话,请使用:

self.levelNum = [[NSUserDefaults standardUserDefaults ] integerForKey: @"Current Level"]; 

"integerForKey:"是当你使用“setInteger:forKey:”使用正确的方法。

+0

啊,你是对的。那是一个问题,虽然问题仍然存在。 –

+0

将你的''levelNum''声明从''int''改为''NSInteger'“,并且知道它是否对你有好处。 –

+0

NSInteger是一个相当于int或long的typedef:http://stackoverflow.com/a/1753275/1344738 – abellina

0

哦。我的。神。我是个白痴。我忘记了我定义了一个自定义的setLevelNum方法,以防止级别设置在现有级别的范围之外。由于上面的代码在我定义了关卡集之前就已经出现了,它会自动将其设置为最低级别,即1。谢谢大家的帮助。至少我学到了很多关于Objective-C数据类型的知识:-)