2011-11-14 48 views
1

我在我的下面幾行代碼:爲什麼registerDefaults中的setValue會給BOOL YES一個警告?

[registerDefaults setValue:NO forKey:UserDefaultsGameSortAscendingKey]; 
[registerDefaults setValue:YES forKey:UserDefaultsReminderSortAscendingKey]; 

爲什麼,我在第二行得到一個警告,而不是第一?

不相容整數指針轉換

兩個UserDefaultsGameSortAscendingKeyUserDefaultsReminderSortAscendingKey被定義爲常數:

extern NSString *const UserDefaultsGameSortAscendingKey; 
extern NSString *const UserDefaultsReminderSortAscendingKey; 

回答

4

您需要包裹布爾值將作爲NSNumbers並將其存儲到默認值:

[registerDefaults setValue:[NSNumber numberWithBool:NO] forKey:UserDefaultsGame...]; 
[registerDefaults setValue:[NSNumber numberWithBOOL:YES] forKey:UserDefaultsGame...]; 
+0

你的代碼是正確的,但它不是演員。說你需要包裝BOOL會更準確。 –

+0

澄清反映在編輯中。然而,我對「鑄造」的定義幾乎與維基百科的定義相符:在計算機科學中,類型轉換,類型轉換和強制指的是以不同方式隱式或顯式地將一種數據類型的實體變爲另一種。 – isaac

+0

至少在C派生語言中,「強制轉換」是指在不實際更改內存中表示的情況下更改某種類型的內容。然而,在這種情況下,你使用'NSNumber'對象包裝BOOL值,並且結果值具有與原始BOOL不同的內存中表示。 –

2

您應該使用setBool:forKey:。這將消除警告(其中@ Isaac的答案解釋的原因),爲您節省編寫代碼的時間,因爲任何鑄造/轉換爲你做不太容易出錯:

[registerDefaults setBool:NO forKey:UserDefaultsGameSortAscendingKey]; 
[registerDefaults setBool:YES forKey:UserDefaultsReminderSortAscendingKey]; 

From the NSUserDefaults Docs

setBool:forKey: 

將指定的默認鍵值設置爲指定的布爾值 值。

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName 

value
布爾值存儲在數據庫中的默認值。

​​
與該值關聯的鍵。

+1

+1爲方便 – isaac

+0

我假設原始問題中的'registerDefaults'指示用於使用方法:' - (void)registerDefaults:(NSDictionary *)dictionary'設置默認值的字典。不幸的是' - (void)setBool:(BOOL)forKey:(NSString *)defaultName'的值在這種情況下不能使用。 – Andrea

+0

@A可能是一個常規詞典或NSUserDefaults,如果沒有OP說明,我們將不會知道。基於無法確認的假設進行下調並不正確。 Downvotes應用於明顯錯誤,質量差,垃圾郵件等問題的答案。 – chown

0

是的,正如其他人所指出的,你應該使用setBool:forKey:或包裹BOOL中的NSNumber。現在回答你的問題實際:

的setValue:forKey:定義爲:

- (void)setValue:(id)value forKey:(NSString *)key 

值類型爲id,這將是一個指向任何種類的對象。 NO的計算結果爲0或nil,這是id類型變量(或任何指針)的有效版本。 YES計算結果爲1,這對於id類型的變量不是有效值。因此警告。

相關問題