Ios 为什么非零数字无法将布尔属性设置为“是”?
我的理解是,在基于C的目标C中,所有布尔值基本上都是短的(-127到128),零是“FALSE”或“NO”的唯一值。然而,当我最近尝试根据位掩码设置按钮的选定值时,它失败了。为什么?Ios 为什么非零数字无法将布尔属性设置为“是”?,ios,objective-c,bitmask,Ios,Objective C,Bitmask,我的理解是,在基于C的目标C中,所有布尔值基本上都是短的(-127到128),零是“FALSE”或“NO”的唯一值。然而,当我最近尝试根据位掩码设置按钮的选定值时,它失败了。为什么? NSInteger bitfield = 127; NSInteger bitmask = 1 << 6; // 64 myButton.selected = bitfield & bitmask; // selected will remain NO NSInteger位字段=127; N
NSInteger bitfield = 127;
NSInteger bitmask = 1 << 6; // 64
myButton.selected = bitfield & bitmask; // selected will remain NO
NSInteger位字段=127;
NSInteger bitmask=1这是因为BOOL
不是BOOL
BOOL
只是(非BOOL
)整型的非标准(目标特定)类型定义(据我所知,它总是signed char
,但我可能错了)。因此,它不是真正的布尔数据类型,而是它的基础整数类型。因此,如果将64
分配给它,它将存储64(而不是true
或1
)。因此,始终假定true
值为1(即LSB集)的操作可能无法识别64
相反,如果将BOOL
替换为真正的C99布尔类型,即\u BOOL
或BOOL
,则您将体验到预期的行为。也就是说,将任何非零值赋给变量将使其存储true
或1
,而不管该值是否为真1。这是因为BOOL
不是BOOL
BOOL
只是(非BOOL
)整型的非标准(目标特定)类型定义(据我所知,它总是signed char
,但我可能错了)。因此,它不是真正的布尔数据类型,而是它的基础整数类型。因此,如果将64
分配给它,它将存储64(而不是true
或1
)。因此,始终假定true
值为1(即LSB集)的操作可能无法识别64
相反,如果将BOOL
替换为真正的C99布尔类型,即\u BOOL
或BOOL
,则您将体验到预期的行为。也就是说,给变量赋值任何非零值都会让它存储true
或1
,不管该值是否真的为1。不是我不相信你,而是我不相信你。虽然如果你做了myButton.selected=!!会激发更多的信心!!(位字段和位掩码)代码>@Havenard C确实有bool
@HotLicks你为什么不相信他BOOL
不是BOOL
,因此它不像真正的布尔值。GoldenJoe,请执行以下操作:NSLog(@“selected is%s”,myButton.selected?:“YES”:“NO”)代码>。问题可能是所选的
的一些消费者转而(而且有些不适当地)使用它执行&
和|
操作,而不是使用&
和|
。(或执行==YES
等)UIControl
选择了一个实例变量unsigned int:1
。我的测试表明,为“selected”属性赋值只会将最低有效位赋值给该位字段。例如,self.myButton.selected=3;NSLog(@“%d”,self.myButton.selected)代码>打印1
。不是我不相信你,而是我不相信你。虽然如果你做了myButton.selected=!!会激发更多的信心!!(位字段和位掩码)代码>@Havenard C确实有bool
@HotLicks你为什么不相信他BOOL
不是BOOL
,因此它不像真正的布尔值。GoldenJoe,请执行以下操作:NSLog(@“selected is%s”,myButton.selected?:“YES”:“NO”)代码>。问题可能是所选的
的一些消费者转而(而且有些不适当地)使用它执行&
和|
操作,而不是使用&
和|
。(或执行==YES
等)UIControl
选择了一个实例变量unsigned int:1
。我的测试表明,为“selected”属性赋值只会将最低有效位赋值给该位字段。例如,self.myButton.selected=3;NSLog(@“%d”,self.myButton.selected)代码>打印1
。当场打印。这个答案的关键部分是“一个总是假定真值为1(即LSB集)的操作将无法识别64”。除非通过与0
进行比较(这对于条件--if(myBool)
或myBool?…:…
)是隐式的),否则永远不要计算BOOL
。@JoshCaswell是的,没错。那么这是OP代码中的错误吗(因为您“必须”为myButton.selected指定是或否),或者“selected”属性(如上所述,它只将LSB存储在大小为1的位字段中)的实现中出现错误?@MartinR我想说OP的代码中有错误,但更确切地说是他的假设中的错误。@H2CO3这不是苹果特有的BOOL
可追溯到Objective-C的创建,可能早于BOOL
。它是在ObjC仅仅是一个C预处理器扩展+运行时时创建的。因此,向具有新规则(如强制的YES/NO值)的编译器添加新类型非常困难(如果不是不可能的话)。是的,这是一个皮塔。修复它是一个更大的PITA,因为总是有一些重要的代码基会被破坏,并且在编译器被rev'd.Spot启动时没有资源/时间来修复。这个答案的关键部分是“一个总是假定真值为1(即LSB集)的操作将无法识别64”。除非通过与0
进行比较(这对于条件是隐式的--if(myBool)
或myBool。。