5

我看过很多 ObjC 代码,它们可以:

obj = [[SomeObject alloc] init];
if (obj) {
/// ...
}

但据我了解,() 里面的值是布尔值,0 表示 FALSE 1 表示 TRUE(在其他语言中还有另一种情况,0 为真,1 为假),如果指针不指向任何东西,它设置为 NULL(nil),即 #defined 为 0,所以我想知道如果我这样做会更好:

if (obj != nil) {
/// ...
}

因为它正在检查 obj 是否为 nil,无论值nil是什么,所以它不依赖于nil(或NULL)恰好被定义为 0?

4

2 回答 2

5

编辑: 经过一番测试,我确定现代编译器实际上会为这两种情况创建相同的机器代码

原帖:

它(也许可以忽略不计)使用效率更高

if(obj) {

因为您不需要创建中间布尔值(通过评估比较表达式)。关于非零为 FALSE,我不确定您指的是哪种“其他语言”;我能想到的最接近的事情是 c 程序为“成功”返回 0,为“错误”返回任何其他值。我曾经使用过的每一种现代语言都使用 0 作为 FALSE,使用任何非零值作为 TRUE。

在 Objective-C 中,nil 实际上是 0(被视为指针)。它不仅仅是一个指向零的指针,它作为一个指针是零。因此,它可靠地等同于 FALSE(或者,在我们的命名法中为“NO”)。

经过一番测试后编辑 ,我确定现代编译器实际上会为这两种情况创建相同的机器代码;可能是因为 nil 本质上是 typedef 为 0,所以它知道两种检查方式都在说“如果这个指针非零”。

于 2012-08-06T00:27:09.103 回答
3

0 表示 FALSE 1 表示 TRUE

关。在 C(和 Objective-C)中,0 计算为假,非零计算为真。所以一个 nil(或 NULL)指针是“假”的,但任何非 nil 指针都是“真”。

您的示例本质上是等效的;两者都不比另一个“更好”(除非您或您的代码库有风格偏好)。

于 2012-08-06T00:25:18.163 回答