Objective c 如何检测NSString是否为空?

Objective c 如何检测NSString是否为空?,objective-c,null,nsnull,Objective C,Null,Nsnull,我有一段代码可以检测NSString是否为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"];

我有一段代码可以检测
NSString
是否为
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 IsequalString:
:未识别的选择器发送到实例
0x3eba63d4


我做错什么了吗?是否需要以其他方式执行此操作?

目标C对象的
NULL
值(type
id
)为
nil

NULL
用于C指针(键入
void*

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

目标-C中:

if (getCaption == nil) ...
  • nil
    (全部小写)为空 指向Objective-C对象的指针
  • Nil
    (大写)是空指针 到目标C类
  • NULL
    (所有大写)是指向 其他任何内容(C指针)
  • [NSNull null]
    是一个单例,适用于无法使用nil的情况(例如,向
    NSArray添加/接收nil)
在Objective-C++中:

if (getCaption == nil) ...
  • 以上所有内容,加上:
  • null
    (小写)或
    null ptr
    C++11或更高版本)是指向C++对象的空指针

因此,要对照
nil
进行检查,您应该明确地比较
nil
(或分别比较
NULL

if (getCaption == nil) ...
或者让ObjC
/C隐式地
为您做这件事:

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

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

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

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

if ((NSNull *)getCaption == [NSNull null]) ...
或(首选,见备注):


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

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

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

有关形成等效阳性检查的帮助,请参见和

编辑:刚刚发表了一篇关于nil、null等之间细微差别的文章。

您应该使用

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

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

if([getCaption class] == [NSNull class])
    ...
你也可以

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

如果您想对NSNull的新子类做进一步的验证。

检查
NSNull
的首选方法是

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

只需使用以下代码进行检查:

NSString *object;

if(object == nil)

这应该行。

第二行的数据类型是什么?为什么要发送它?
-valueForKey:
?我将留下此评论供进一步参考:
-valueForKey:
是一种KVC方法。在KVC中,
[NSNull null]
表示给定键缺少值。如果在不需要KVC的上下文中使用
NSDictionary
,请改用
-objectForKey:
-它将返回
nil
,而不是
[NSNull]
当字典中不存在给定的键时。有关
-valueForKey:
-objectForKey:
之间区别的讨论,请参阅此堆栈溢出问题:从数据库填充的数组中获取对象…另一个注意事项(ha!:-))-看起来您正在使用某个非Apple类从数据库查询中获取结果。如果列为NULL(如SQL NULL),则此类在填充字典时有两个选项:要么不包含相应的键,要么包含映射到
[NSNull NULL]
值的对应键。因此,这个类是如何表示SQL null值的,并且您的测试需要考虑这个类的细节。true,虽然实际错误是 [RoWuxValueFoKy:@“标题”]
返回的是一个
NSNull
实例,而不是
NSString
实例。@bavariage:请参阅答案的最后一行。@phpnerd211:这可能并不能解决您真正的问题--请参阅bavariage随问题附上的注释。他错了。我在我的应用程序中都使用了这种方法,并且它运行正常——请参阅我在代码中对数组填充方式的编辑,等等。getCaption==[NSNull null]是一个不好的使用方法。最好执行[getCaption类]=[NSNull类]。您可以自由创建NSNull的新实例,一些JSON解析器会创建新实例,而不是使用单例。由于NSNull是单例,您实际上可以直接比较指针:
if(getCaption==[NSNull])…
但与单例进行比较是个坏主意!Don do it=X。[NSNull null]可能是一个单例,但NSNull与其他任何类一样是一个类。在本页的所有答案中,只有您的答案在Xcode 6.1中对我有效,使用了名为
body
的NSString属性,该属性为null。调试器输出:
\u body NSString*class name=NSNull 0x0000000107279ce0
打印ad的说明->\u body: