我有一段代码,可以检测NSString是否为NULLnil等.但是,它崩溃了.这是我的代码:

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 isEqualToString:]:无法识别的 Select 器已发送到实例0x3eba63d4"

我做错什么了吗?我需要换一种方式吗?

推荐答案

Objective-C objects(id型)的NULL值为nil.

NULL用于C pointers(void *型).

(最终,两者都持有相同的价值(0x0).然而,它们的类型不同.)

Objective-C年:

  • nil (all lower-case)是空的
  • Nil (capitalized)是空指针
  • NULL (all caps)是指向的空指针
  • 对于use of nil is not possible(例如,在NSArrays中添加/接收零)的情况,[NSNull null]singleton

Objective-C++年:

  • All of the above,加上:
  • null (lowercase)nullptr(C++11或更高版本)是指向C++ objects的空指针.

因此,要对照nil进行判断,您应该将nil(或分别为NULL)与explicitly进行比较:

if (getCaption == nil) ...

或者让ObjC/C为你做implicitly:

if (!getCaption) ...

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

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

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

因此,要对照NSNull,可以使用:

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

或者(首选,请参见 comments ):

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

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

因此,如果一个(无论出于何种原因)需要check against both nil/NULL and NSNull,则必须将这两个判断结合起来:

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

有关equivalent positive checks的帮助,请参见De Morgan's lawsboolean negation.

Edit:NSHipster.com刚刚发表了一篇关于nil、null等之间细微差别的伟大文章.

Objective-c相关问答推荐

TWTweetComposeViewController 在 IOS6 中已弃用

如何使用第一个字符作为部分名称

协议与类别

核心数据 - 如何获取具有最大值属性的实体

将类作为参数传递?

滚动 NSScrollView 时的回调?

iOS:将 URL 解析为段

Objective-C 方法中的静态变量是否跨实例共享?

你如何安排一个块在下一次运行循环迭代中运行?

在 Cocoa 中你更喜欢 NSInteger 还是 int,为什么?

具有多个嵌入 segues 的 ContainerView

UITableView configureCellForDisplay:forIndexPath 中的断言失败:

UIViewController 的 prefersStatusBarHidden 不起作用

iOS6:supportedInterfaceOrientations 不起作用(被调用但界面仍然旋转)

如何在表格视图中的两个单元格之间留出空间?

在 Objective C 中,你能判断一个对象是否具有特定的属性或消息吗?

交换 NSMutableArray 中的元素

我可以在 Objective-C switch 语句中声明变量吗?

使用正则表达式查找/替换 NSString 中的子字符串

@package 指令在 Objective-C 中的作用是什么?