有一天,用戶向我報告了一個關於應該啓用的工具欄項目被禁用的錯誤。驗證碼(簡化了您的利益)看起來像:爲什麼BOOL是一個有符號的char?
- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem {
NSArray* someArray = /* arrray from somewhere*/
return [someArray count];
}
我花了幾分鐘的時間來意識到-count返回一個32位無符號整數,而BOOL是一個8位有符號的字符。在這種情況下,someArray中有768個元素,這意味着低8位全爲0.當返回時將int轉換爲BOOL時,即使人們期望答案,它也會解析爲NO
爲YES
。
我已經改變了我的代碼到return [someArray count] > 0;
然而,現在我很好奇爲什麼BOOL真的是一個簽名字符。這是真的「更好」在某種程度上,然後它是一個int?
由於這個原因,你會經常看到'!! [someArray count]'(幾乎和'> 0'一樣) – cobbal 2010-09-30 23:50:11
如果你再仔細考慮一下你的問題,你會發現它非常多相當於「爲什麼*任何類型*與int不一樣?」因爲答案几乎相同。更小的標量類型在那裏,因爲它們不需要int的全部範圍。 BOOL甚至不需要完整的簽名字符範圍,但沒有可用的更小類型。 – Chuck 2010-10-01 00:40:51
無論用什麼實際類型來實現布爾變量,你都不應該將布爾表達式的結果賦值給布爾變量。去檢查你的代碼爲這樣的其他可憎的。 – Sven 2010-10-01 09:28:54