我有一段代码可以检测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 isEqualToString:]
:无法识别的选择器已发送至实例0x3eba63d4
”
我做错了吗?我需要以不同的方式做到这一点吗?
答案 0 :(得分:168)
Objective-C对象的NULL
值(类型id
)为nil
。
虽然NULL
用于 C指针(类型void *
)。
(最后两者最终都保持相同的值(0x0
)。但它们的类型不同。)
在 Objective-C :
中nil
(全部为小写)为空
指向 Objective-C对象。Nil
(大写)是一个空指针
到 Objective-C类。 NULL
(全部大写)是一个空指针
其他任何( C指针,即。[NSNull null]
是单身,适用于无法使用nil 的情况(例如,添加/接收来自NSArray
的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]]) ...
请注意,如果false
恰好是getCaption
,后者(使用消息调用)将返回nil
,虽然正式正确,但可能不符合您的预期/ {想。
因此,如果一个(无论出于何种原因)需要检查 nil
/ NULL
和 NSNull
,必须结合这两个检查:
if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
有关形成等效肯定检查的帮助,请参阅De Morgan's laws和boolean negation。
编辑: NSHipster.com刚刚发表了一篇关于nil,null等之间细微差别的精彩文章。
答案 1 :(得分:24)
你应该使用
if ([myNSString isEqual:[NSNull null]])
这将检查对象myNSString是否等于NSNull对象。
答案 2 :(得分:6)
检查NSNULL
的首选方法是
if(!getCaption || [getCaption isKindOfClass:[NSNull class]])
答案 3 :(得分:2)
if([getCaption class] == [NSNull class])
...
您也可以
if([getCaption isKindOfClass:[NSNull class]])
...
如果您希望将来证明NSNull的新子类。
答案 4 :(得分:2)
只需查看此代码:
NSString *object;
if(object == nil)
这应该有用。