如何检测NSString是否为空?
如何检测NSString是否为空?
我有一段代码,用于检测一个`NSString`是否为`NULL`、`nil`等。然而,它导致程序崩溃。以下是我的代码:\n
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 || getCaption == nil || [getCaption isEqualToString:@""] || [getCaption isEqualToString:@" "]) { theCaption = @"Photo uploaded..."; } }
\n以下是错误信息:\n
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3eba63d4'
\n我做错了什么吗?我需要以不同的方式来处理吗?
NSString是一个常用的Objective-C类,用于表示字符串。有时候我们需要判断一个NSString对象是否为空(null)。下面的内容提供了两种方法来判断NSString是否为空,并给出了解决方案。
第一种方法是使用`isEqual:`方法来判断:
if ([myNSString isEqual:[NSNull null]]) { // NSString对象为空 }
这种方法会检查myNSString对象是否与NSNull对象相等。
第二种方法是直接比较指针是否相等:
if (myNSString == [NSNull null]) { // NSString对象为空 }
因为NSNull是一个单例对象,所以可以直接比较指针是否相等。
但是,直接比较指针是否相等并不是一个好方法。虽然[NSNull null]是一个单例对象,但是NSNull仍然是一个类,可能会有其他的实例存在。所以,不建议使用这种方法来判断NSString是否为空。
以上就是如何判断NSString是否为空的方法和解决方案。希望对你有所帮助!
如何检测NSString是否为null?
Objective-C对象的NULL值(类型为id)是nil。
而NULL用于C指针(类型为void *)。
(最终两者都会保存相同的值(0x0)。但它们在类型上有所不同。)
在Objective-C中:
- nil(全小写)是指向Objective-C对象的空指针。
- Nil(大写)是指向Objective-C类的空指针。
- NULL(全大写)是指向其他任何东西的空指针(即C指针)。
- [NSNull null]是在无法使用nil的情况下(例如向NSArray添加/接收nil),用于替代nil的单例。
在Objective-C++中:
- 除了上述所有内容外,还有:
- null(小写)或nullptr(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]) ...
或(首选,参见注释):
if ([getCaption isKindOfClass:[NSNull class]]) ...
请记住,后一种方法(利用消息调用)如果getCaption恰好为nil,则返回false,虽然形式上是正确的,但可能不是您所期望的。
因此,如果由于某种原因需要同时检查nil / NULL和NSNull,那么必须结合这两个检查:
if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
有关等效正检查的帮助,请参见De Morgan定律和布尔否定。
编辑:NSHipster.com刚刚发表了一篇关于nil、null等之间微妙差别的优秀文章。
真相是,[rowtwo valueForKey:@"caption"]返回的是一个NSNull实例,而不是一个NSString实例。
请参阅答案中的最后一行。
这可能并不能解决您真正的问题,请参阅与问题相关的Bavarious的评论。
他弄错了。我在我的应用程序中到处使用这种方法,它可以正常工作-请参阅我在代码中的编辑,以了解我如何填充数组等。
我建议您不要使用-valueForKey:,因为它有不同的用途。如果您使用NSDictionary,请使用其-[NSDictionary objectForKey:]方法。如果要了解更多关于KVC和-valueForKey:的信息,请参考苹果网站上的几个指南。
getCaption == [NSNull null]是一个不好的使用方法。最好使用[getCaption class] == [NSNull class]。您可以自由地创建NSNull的新实例,而不是使用单例。
我发现使用'(getCaption == [NSNull null])'也可以正常工作,但会出现比较警告,所以我将其更改为'if (getCaption == (id)[NSNull null])'。
我还必须检查NSNull,很奇怪。似乎我的NSString被设置了。
完美的答案,清晰明了。
谢谢!完美的答案!