如何检测NSString是否为空?
我有一段代码,检测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..."; } }
这里是错误:
由于未捕获exception'
NSInvalidArgumentException
',原因:'-[NSNull isEqualToString:]
:无法识别的select器发送到实例0x3eba63d4
'
难道我做错了什么? 我需要以不同的方式去做吗?
Objective-C对象 (typesid
)的NULL
值nil
。
NULL
用于C指针 (types为void *
)。
(最后两端保持相同的值( 0x0
),但它们的types不同)。
在Objective-C中 :
-
nil
(全部小写)是一个指向Objective-C对象的空指针。 -
Nil
(大写)是一个指向Objective-C类的空指针。 -
NULL
(全部大写)是指向其他任何东西( C指针 ,即是)的空指针。 -
[NSNull null]
是一个单一的情况下使用零是不可能的 (添加/从NSArray
接收零例如)
在Objective-C ++中 :
- 以上所有 ,再加上:
-
null
(小写)或nullptr
( C ++ 11或更高版本)是一个指向C ++对象的空指针。
因此,为了检查nil
你应该明确地比较nil
(或分别为NULL
):
if (getCaption == nil) ...
或者让ObjC / C为你隐式做:
if (!getCaption) ...
这适用于C中的每个expression式( 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等细微差别的文章
你应该使用
if ([myNSString isEqual:[NSNull null]])
这将检查对象myNSString是否等于NSNull对象。
检查NSNULL
首选方法是
if(!getCaption || [getCaption isKindOfClass:[NSNull class]])
if([getCaption class] == [NSNull class]) ...
你也可以做
if([getCaption isKindOfClass:[NSNull class]]) ...
如果你想成为NSNull的新的子类的未来certificate。
只需检查这个代码:
NSString *object; if(object == nil)
这应该工作。