2012-09-26 83 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數據類型的知識:-)