如何检测NSString是否为空?

我有一段代码,检测NSStringNULLnil等,但是,它崩溃。 这是我的代码:

 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..."; } } 

这里是错误:

由于未捕获exception' NSInvalidArgumentException ',原因:' -[NSNull isEqualToString:] :无法识别的select器发送到实例0x3eba63d4 '

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

Objective-C对象 (typesid )的NULLnil

NULL用于C指针 (types为void * )。

(最后两端保持相同的值( 0x0 ),但它们的types不同)。

Objective-C中

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

Objective-C ++中

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

因此,为了检查nil你应该明确地比较nil (或分别为NULL ):

 if (getCaption == nil) ... 

或者让ObjC / C为你隐式做:

 if (!getCaption) ... 

这适用于C中的每个expression式( Objective-C是其超集)都有一个隐含的布尔值:

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

现在当检查NSNull这显然不会工作,因为[NSNull null]返回一个指向NSNull的单例实例,而不是nil ,因此它不等于0x0

所以要检查NSNull可以使用:

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

或(首选,请参阅评论):

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

请记住,如果getCaption恰好nil ,后者(使用消息调用)将返回false ,而这在正式正确的情况下可能不是您所期望的/想要的。

因此,如果一个(无论什么原因)需要检查 nil / NULL NSNull ,则必须结合这两个检查:

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

关于形成等价肯定检查的帮助,请参阅De Morgan的定律和布尔否定 。

编辑: NSHipster.com刚发表了一篇关于nil,null等细微差别的文章

你应该使用

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

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

检查NSNULL首选方法是

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

你也可以做

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

如果你想成为NSNull的新的子类的未来certificate。

只需检查这个代码:

 NSString *object; if(object == nil) 

这应该工作。