Ios 为什么非零数字无法将布尔属性设置为“是”?

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

我的理解是,在基于C的目标C中,所有布尔值基本上都是短的(-127到128),零是“FALSE”或“NO”的唯一值。然而,当我最近尝试根据位掩码设置按钮的选定值时,它失败了。为什么?

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。。