如何检测NSString是否为空?

ios*_*eak 54 null objective-c nsnull

我有一段代码检测如果NSStringNULL,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...";
}

}
Run Code Online (Sandbox Code Playgroud)

这是错误:

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

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

Reg*_*ent 168

NULL对值Objective-C对象(类型id)是nil.

NULL用于C指针(类型void *).

(最后两者最终都保持相同的值(0x0).但它们的类型不同.)

Objective-C中:

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

Objective-C++中:

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

所以要检查nil你应该明确地比较nil(或NULL分别):

if (getCaption == nil) ...
Run Code Online (Sandbox Code Playgroud)

还是让ObjC/ç隐含了你:

if (!getCaption) ...
Run Code Online (Sandbox Code Playgroud)

这适用于C中的每个表达式(并且Objective-C是其超集)具有隐式布尔值:

expression != 0x0 => true
expression == 0x0 => false
Run Code Online (Sandbox Code Playgroud)

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

所以要检查NSNull一个可以使用:

if ((NSNull *)getCaption == [NSNull null]) ...
Run Code Online (Sandbox Code Playgroud)

或(首选,见评论):

if ([getCaption isKindOfClass:[NSNull class]]) ...
Run Code Online (Sandbox Code Playgroud)

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

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

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
Run Code Online (Sandbox Code Playgroud)

有关形成等效正面检查的帮助,请参阅De Morgan定律布尔否定.

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

  • 没错,虽然实际的错误是`[rowtwo valueForKey:@"caption"]`正在返回一个`NSNull`实例而不是一个`NSString`实例. (2认同)

lud*_*ign 24

你应该用

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

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

  • 由于NSNull是一个单例,你可以直接比较指针:`if(getCaption == [NSNull null])...` (4认同)

小智 6

首选的方法来检查NSNULLIS

if(!getCaption || [getCaption isKindOfClass:[NSNull class]])   
Run Code Online (Sandbox Code Playgroud)