Objective-C:将id转换为BOOL的结果?

ma1*_*w28 13 boolean objective-c

请问下面的函数返回YES如果object != nil

- (BOOL)boolForObject:(id)object {
    return (BOOL)object;
}
Run Code Online (Sandbox Code Playgroud)

我已经测试过,object = [[NSObject alloc] init]但结果好坏参半.

pro*_*rmr 29

指针大于BOOL,因此当您转换它时,它将截断并仅占用指针的8个最低有效位并使其成为BOOL.如果这些位都碰巧为零,那么这相当于NO.

所以回答你的问题,不,它没有(有时它会取决于指针值)

以下是在32位架构上使用Xcode 5.1.1的示例:

void* p = (void*)0xfeeeff00;
BOOL  b = (BOOL)p;

NSLog(@"p=%08x (%lu), b=%08x (%lu)", (uint32_t)p, sizeof p, (uint32_t)b, sizeof b);
Run Code Online (Sandbox Code Playgroud)

打印出来:

p=feeeff00 (4), b=00000000 (1)
Run Code Online (Sandbox Code Playgroud)

  • 为了完整性:转换为`bool`或`_Bool`将按预期工作,为任何非零指针生成`true`. (2认同)
  • Mike Ash也有很好的解释http://www.mikeash.com/pyblog/friday-qa-2012-12-14-objective-c-pitfalls.html (2认同)

Jes*_*and 7

你方法的实际目的是什么?

如果只是检查对象是否为零,为什么不这样做:

- (BOOL)boolForObject:(id)object 
{
    return (object != nil);
}
Run Code Online (Sandbox Code Playgroud)

结果会更明显.


Sam*_*win 5

你也可以这样做:

return !!object;
Run Code Online (Sandbox Code Playgroud)