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
值(typeid
)为nil
而NULL
用于C指针(键入void*
)
(最终,两者都持有相同的值(0x0
)。但它们的类型不同。)
在目标-C中:
if (getCaption == nil) ...
(全部小写)为空 指向Objective-C对象的指针nil
(大写)是空指针 到目标C类李>Nil
(所有大写)是指向 其他任何内容(C指针)NULL
是一个单例,适用于无法使用nil的情况(例如,向[NSNull null]
NSArray添加/接收nil)
if (getCaption == nil) ...
- 以上所有内容,加上:
(小写)或null
(C++11或更高版本)是指向C++对象的空指针null ptr
因此,要对照
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,虽然实际错误是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: