2010-06-22 109 views
1

我試圖從我的首選項文件,這是一個整數檢索一個值。有趣的是,它總是返回零,雖然它確實存在,並且integerForKey:setIntegerForKey:的名稱都是相同的。integerForKey:總是返回零

這是我如何檢索值:[defaults integerForKey:@"BackUpSize"];

在這裏,我將它設置:[defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@"BackUpSize"];

我驚呆了。它應該工作......或者我在這裏錯過了什麼?

感謝

編輯:默認創建爲這樣:NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];

編輯:我試圖創造我自己的方法NSUserDefaults的這個問題,但它仍返回零。

-(void)setDouble:(double)dou forKey:(id)key 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:dou] forKey:key]; 
} 
-(double)doubleForKey:(id)key 
{ 
    return [[[NSUserDefaults standardUserDefaults] objectForKey:key] doubleValue]; 
} 
+1

您是否驗證過'defaults'不是'nil'? 「nil」方法調用返回...「0」。 – 2010-06-22 09:51:19

+1

默認值只是[NSUserDefaults standardUserDefaults] ... – Pripyat 2010-06-22 09:55:26

+1

只是驗證它,它不是零。 – Pripyat 2010-06-22 09:56:18

回答

3

8589934592是硬編碼文字? 真的嗎?你至少應該放一些像1 << 33。即使這樣,聲明它是一個常數,因爲大聲哭泣。

如果您正在構建32位,NSInteger是一個32位有符號值。所以你很可能會溢出。我不確定在這種情況下NSUserDefaults的行爲是什麼,但值得考慮。

+3

令我印象深刻的是,您將它視爲1 << 33。 ☺ – 2010-06-22 10:44:52

0

你正將一個double傳遞給需要一個整數的東西。通常情況下,您會希望發生一些截斷,並以int結尾,但您不能保證setInteger:forKey:方法可以爲您做到這一點。

爲什麼你將滑塊值乘以表面上任意的數字?

編輯:

解釋我的答案多一點:

爲了存儲在他們需要被包裹在NSNumber對象的默認號碼。 setInteger:forKey等等,都是方便的方法,可能只是取整數並使用numberWithInt:從中創建一個NSNnumber。我不能100%確定,因爲我沒有看到蘋果的代碼,但我認爲傳遞一個到numberWithInt:的double將返回nil,因爲double不是int。

+1

我之所以乘以它是因爲滑塊需要定義我的應用程序可能使用多少空間,在我的情況下是以字節爲單位定義的,但我需要它在GB 1字節時間8589934592等於1GB。然後我比較文件夾的大小(這也是以字節爲單位,所以我需要再次乘以)與滑塊之一,看看是否已達到限制。我應該用什麼來代替setIntegerForKey?只需使用setObjectForKey? – Pripyat 2010-06-22 10:04:09

+1

objectForKey不會工作... – Pripyat 2010-06-22 10:06:03

+1

我建議使用'numberWithDouble:',然後使用'setObject:forKey',從最終的double值創建一個'NSNumber'對象。 – Jasarien 2010-06-22 10:07:07

1

這類問題的另一個常見原因是使用將值存儲到用戶默認值的自定義設置器。如果你這樣做,並且如果你不小心只訪問你的用戶默認代碼中的ivars,那麼你在閱讀時會冒着跺腳存儲的首選項的風險。