55

我有一段代码可以检测 aNSString是否为NULL,nil等。但是,它崩溃了。这是我的代码:

NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready='yes' LIMIT 0,1"];
for (NSDictionary *rowtwo in resultstwo) {

NSString *getCaption = [rowtwo valueForKey:@"caption"];

if (getCaption == NULL) {
theCaption = @"Photo uploaded...";
} else if (getCaption == nil) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@""]) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@" "]) {
theCaption = @"Photo uploaded...";
}

}

这是错误:

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“ -[NSNull isEqualToString:]:无法识别的选择器发送到实例0x3eba63d4

难道我做错了什么?我需要以不同的方式来做吗?

4

5 回答 5

172

Objective-C 对象(类型)的NULL值为.idnil

WhileNULL用于C 指针(类型void *)。

(最终两者都持有相同的值(0x0)。但是它们的类型不同。)

Objective-C 中

  • nil (全部小写)是一个指向Objective-C 对象的空指针。
  • Nil (大写)是一个指向Objective-C 类的空指针。
  • NULL (全部大写)是指向其他任何东西的空指针(即C 指针
  • [NSNull null]在无法使用 nil的情况下是单例(向/从s添加/接收 nil )NSArray

Objective-C++ 中

  • 以上所有,加上:
  • null (小写)nullptrC++11或更高版本)是指向C++ 对象的空指针。

因此,要检查您应该明确nil比较nil(或NULL分别):

if (getCaption == nil) ...

或让ObjC / C为您隐式执行:

if (!getCaption) ...

这是因为C中的每个表达式(并且Objective-C是其超集)都有一个隐含的布尔值:

expression != 0x0 => true
expression == 0x0 => false

现在,当检查NSNullthis 时显然不起作用,因为[NSNull null]返回指向NSNull, 而不是的单例实例的指针nil,因此它不等于0x0

因此,要检查NSNull一个可以使用:

if ((NSNull *)getCaption == [NSNull null]) ...

或(首选,见评论):

if ([getCaption isKindOfClass:[NSNull class]]) ...

请记住,false如果getCaption碰巧是nil,后者(使用消息调用)将返回,虽然形式上正确,但可能不是您期望/想要的。

因此,如果一个人(无论出于何种原因)需要同时检查 nil/NULL NSNull,则必须将这两个检查结合起来:

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

有关形成等效正检查的帮助,请参阅德摩根定律布尔否定

编辑: NSHipster.com刚刚发表了一篇很棒的文章,介绍了 nil、null 等之间的细微差别。

于 2011-04-16T02:44:34.853 回答
24

你应该使用

if ([myNSString isEqual:[NSNull null]])

这将检查对象 myNSString 是否等于 NSNull 对象。

于 2011-04-16T02:46:59.393 回答
6

检查的首选方法NSNULL

if(!getCaption || [getCaption isKindOfClass:[NSNull class]])   
于 2014-11-24T06:37:08.693 回答
2
if([getCaption class] == [NSNull class])
    ...

你也可以做

if([getCaption isKindOfClass:[NSNull class]])
    ...

如果你想在未来证明 NSNull 的新子类。

于 2012-02-29T01:08:13.560 回答
2

只需检查此代码:

NSString *object;

if(object == nil)

这应该有效。

于 2016-02-23T10:51:25.460 回答