为什么非零数字未能将BOOL属性设置为YES?

时间:2013-11-23 22:22:31

标签: ios objective-c bitmask

据我所知,在Objective C中,基于C,所有BOOL基本上都是短路(-127到128),零是“FALSE”或“NO”的唯一值。但是,当我最近尝试根据位掩码设置按钮的选定值时,它会失败。为什么呢?

NSInteger bitfield = 127;
NSInteger bitmask = 1 << 6; // 64

myButton.selected = bitfield & bitmask; // selected will remain NO

1 个答案:

答案 0 :(得分:5)

因为BOOL不是bool

BOOL对于(非bool)整数类型来说只是一个非标准的(Objective-C特定的)typedef(据我所知,它总是{ {1}}但我可能错了)。因此,表现为真正的布尔数据类型,而是作为其底层整数类型。因此,如果您为其指定signed char,则会存储64(而不是64true)。作为其结果,总是假定1值为1(即LSB集)的操作可能无法识别64这样的操作。

相反,如果您使用真正的C99布尔类型trueBOOL替换_Bool,那么您将体验到预期的行为。例如,为变量分配任何非零值会使其存储booltrue,无论该值是否真的为1。