据我所知,在Objective C中,基于C,所有BOOL基本上都是短路(-127到128),零是“FALSE”或“NO”的唯一值。但是,当我最近尝试根据位掩码设置按钮的选定值时,它会失败。为什么呢?
NSInteger bitfield = 127;
NSInteger bitmask = 1 << 6; // 64
myButton.selected = bitfield & bitmask; // selected will remain NO
答案 0 :(得分:5)
因为BOOL
不是bool
。
BOOL
对于(非bool
)整数类型来说只是一个非标准的(Objective-C特定的)typedef(据我所知,它总是{ {1}}但我可能错了)。因此,不表现为真正的布尔数据类型,而是作为其底层整数类型。因此,如果您为其指定signed char
,则会存储64(而不是64
或true
)。作为其结果,总是假定1
值为1(即LSB集)的操作可能无法识别64这样的操作。
相反,如果您使用真正的C99布尔类型true
或BOOL
替换_Bool
,那么您将体验到预期的行为。例如,为变量分配任何非零值会使其存储bool
或true
,无论该值是否真的为1。