对BOOL不是nil的转换指针返回NO

时间:2011-05-06 11:49:52

标签: objective-c c cocoa

我最近遇到了一个非常难以重现的错误。如果由于某种原因我向BOOL转换了一个不是nil的指针我得到NO !!! 11我知道BOOL是带有signed char的typedef。这可能是个问题吗?

3 个答案:

答案 0 :(得分:4)

因为指针是32位大而char只是8位。因此,当从指针转换为char时,它将修剪24位。因此,剩余的8位只是零的可能性非常高,特别是当指针地址很高时。

您可以做的是:

BOOL myBool = (myPointer != NULL); // This will evaluate if the pointer is true (>0) or false (NULL)

答案 1 :(得分:4)

如果指针的格式为0xNNNNNN00或(在64位上)0xNNNNNNNNNNNNNN00,其中N是任何十六进制数字,则转换为BOOLunsigned char)会留下0,因为它会截断所有非零位。

要将指针正确转换为BOOL,请使用不等式运算符:

BOOL isNotNull = (myPointer != NULL);

答案 2 :(得分:1)

出于这个原因,

BOOL不是应该使用的类型。事实上,我可以想到一个布尔类型的变量很少使用(而不是只使用它所基于的原始值,指针或其他任何东西),除非在巨型位数组的情况下你需要特殊的代码来解决它位。如果你真的想要一个布尔类型,请使用C99 _Bool(或bool中的stdbool.h),它具有正确的转换语义而不是模256减少。