如何检测NSString是否为空?

时间:2011-04-16 02:42:39

标签: objective-c null nsnull

我有一段代码可以检测NSStringNULLnil等等。但是,它会崩溃。这是我的代码:

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

我做错了吗?我需要以不同的方式做到这一点吗?

5 个答案:

答案 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 lawsboolean 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)

这应该有用。