目标C:if(obj){...} AND if(obj!= nil){...},哪个更好?

时间:2012-08-06 00:20:32

标签: objective-c null

我见过很多ObjC代码:

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

但据我所知,inside()中的值是一个布尔值,0表示FALSE 1表示TRUE(在另一种语言中还有另一种情况,0为真,1为假),如果指针没有指向对于任何事情,它被设置为NULL(nil),#define定义为0,所以我想知道如果我做的更好:

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

因为它检查obj是否为零,无论nil是什么值,所以它不依赖于nil(或NULL)碰巧定义为0?

2 个答案:

答案 0 :(得分:5)

修改 经过测试后,我确定现代编译器实际上会为两种情况创建相同的机器代码;

orig post:

使用

(或许可以忽略不计)
if(obj) {

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

在Objective-C中,nil实际上是0(像指针一样对待)。它不仅仅是指向零的指针,它作为指针为零。因此,它可靠地等于FALSE(或者,在我们的术语“否”中)。

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

答案 1 :(得分:3)

  

0表示FALSE 1表示TRUE

关闭。在C(和Objective-C)中,0的计算结果为false,非零的计算结果为true。所以nil(或NULL)指针是“false”,但任何非nil指针都是“true”。

你的例子基本上是等同的;两者都不比另一个“更好”(除非你或你的代码库有样式偏好)。