如何在Objective-C中检查对象是否为空?

12

我知道这似乎很基本,但出于某些原因它似乎不起作用。我有以下代码。

Target *t = self.skill.target;


if (![t isEqual:nil]) {
    NSLog(@"Not nil");
}

我尝试过这个方法,每次结果都是非空的,这很好,但是当t实际上应该为空时就有问题了。我甚至尝试了在代码中加入变化,像这样,但是我的t仍然出现了非空的情况,不知道我做错了什么?:\

Target *t = self.skill.target;
t = nil;

if (![t isEqual:nil]) {
    NSLog(@"Not nil");
}

为什么 if (t == nil) { ... } 不好? - holex
即使t为空,我仍然得到false。 - Lorenzo Ang
这并不是一个可能的情况,你可能严重误解了某些事情。 - holex
你可以查看我的答案 https://dev59.com/jm025IYBdhLWcg3wKSiP#51626469 - Mihir Oza
看了答案之后,我在想这个值能否通过调试器来显示。是我错了还是两种方法都合法? - Ali
4个回答

29

您可以通过检查对象本身来正常执行此操作。在NSHipster for NSNull上也有一个很好的解释。

if( myObject ){
    // do something if object isn't nil
} else {
    // initialize object and do something
}

否则,只需使用


if( myObject == nil ){

} 

3
Target *t = self.skill.target;
t = nil;

if (t) {
    NSLog(@"t is Not nil");
}
if (!t) {
    NSLog(@"t is nil");
}

1

正如this的回答所说:

向 nil 发送任何消息都会返回一个等同于所请求类型的 0 的结果。由于布尔值的 0 是 NO,因此这就是结果。

因此,nil 对象很特殊。您不能使用 isEqual 方法进行比较。您应该在不发送消息的情况下进行比较,就像这样:

if (t) 
{
}

或者简单说:
if (t != nil)
{
}

1

if 操作检查 nillable,所以这应该可以工作:

Target *t = self.skill.target;
if (t) {
    NSLog(@"Not nil");
}else{
    NSLog(@"nil");
}

希望能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接