我读了Mike Ash's Objective-C pitfalls page ,现在我对将 id
类型的变量隐式转换为 BOOL
感到疑惑。
假设我有一个低位归零的“危险”指针,因此将其转换为 BOOL
会产生 NO
,即使它指向一个有效对象.我们称这个“危险”指针为 foo
。
简单的 if 语句如何工作?
if 语句在评估条件时是否将 foo
转换为 BOOL
?还是转换为纯 boolean 值?
if( foo )
{
[myArray addObject:foo];
}
它在三元表达式中的工作方式是否相同?
// Does this break when foo is 'dangerous'?
self.titleLabel.hidden = foo ? YES : NO ;
或者如果我这样做,三元组只会中断:
// I'm pretty sure it breaks now
self.titleLabel.hidden = ((BOOL)foo) ? YES : NO ;
我觉得我缺少一些关于 C 语言逻辑运算的基本知识,以及它们与 BOOL
的关系。请大家帮忙赐教。
最佳答案
When does Objective-C implicitly cast to BOOL?
从不,因为这个短语在语义上是不正确的。根据定义,强制转换是显式的。你问的是所谓的“隐式类型转换”(强制 - 谢谢,乔希!)。
此外,严格来说,Objective-C 中的条件并不特殊:它们是从 C 继承而来的。因此,当需要将表达式计算为 boolean 值时,不会将其视为 BOOL
,而是作为 int
。
// Does this break when foo is 'dangerous'?`
self.titleLabel.hidden = foo ? YES : NO;
不,它没有。 (expr)
当用作“boolean ”表达式时,等同于 (expr != 0)
。这里没有风险。
// I'm pretty sure it breaks now
self.titleLabel.hidden = ((BOOL)foo) ? YES : NO;
现在这可能会中断,因为 BOOL
只是类型定义为 signed char
,这在 iOS 上是 8 位的。因此,如果作为(32 位)指针的 foo
被截断为 8 位,并且指针的低 8 位全部为零,但指针本身不是 nil
,这将错误地报告 false。你不想做这种多余的、丑陋的和危险的类型转换。如果你想更明确,写
var = (obj != nil) ? valueOne : valueTwo;
相反。
关于objective-c - Objective-C 何时隐式转换为 BOOL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529781/