我见过很多ObjC代码:
obj = [[SomeObject alloc] init];
if (obj) {
/// ...
}
Run Code Online (Sandbox Code Playgroud)
但正如我所理解的那样,inside()中的值是一个布尔值,0表示FALSE 1表示TRUE(在另一种语言中有另一种情况,0为真,1为假),如果指针没有指向任何东西,它被设置为NULL(nil),#define定义为0,所以我想知道如果我做的更好:
if (obj != nil) {
/// ...
}
Run Code Online (Sandbox Code Playgroud)
因为它检查obj是否为零,无论什么值nil,所以它不依赖于nil(或NULL)恰好被定义为0?
编辑: 经过测试,我确定现代编译器实际上会为两种情况创建相同的机器代码 ;
来源:
它(可以忽略不计,也许)使用效率更高
if(obj) {
Run Code Online (Sandbox Code Playgroud)
因为您不需要创建中间布尔值(通过评估比较表达式).我不确定你指的是关于非零是假的哪种"其他语言"; 我能想到的最接近的事情是c程序为"成功"返回0,为"错误"返回任何其他内容.我曾经使用过的每种现代语言都使用0作为FALSE,使用任何非零值作为TRUE.
在Objective-C中,nil实际上是0(像指针一样对待).它不仅仅是指向零的指针,它作为指针为零.因此,它可靠地等于FALSE(或者,在我们的术语"否"中).
经过测试后编辑,我已经确定现代编译器实际上会为两种情况创建相同的机器代码 ; 可能是因为nil是essentiall typedef'd为0,所以它知道两种检查方式都说"如果这个指针不为零".