【发布时间】:2010-09-30 23:42:26
【问题描述】:
前几天,一位用户向我报告了一个关于工具栏项在应该启用时被禁用的错误。验证代码(为您的利益而简化)如下所示:
- (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的作用几乎相同) -
如果您再仔细考虑一下您的问题,您会发现它几乎等同于“为什么 any type 与 int 不同?”因为答案几乎相同。存在较小的标量类型,因为它们不需要完整的 int 范围。 BOOL 甚至不需要有符号字符的全部范围,但没有可用的更小的类型。
-
你真的不应该将除了布尔表达式的结果之外的任何东西分配给布尔变量,无论使用什么实际类型来实现布尔变量。去检查你的代码是否有其他类似的可憎行为。
标签: objective-c