ios*_*eak 54 null objective-c nsnull
我有一段代码检测如果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...";
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
因未捕获的异常而终止应用'
NSInvalidArgumentException
',原因:'-[NSNull isEqualToString:]
:无法识别的选择器发送到实例0x3eba63d4
'
难道我做错了什么?我需要以不同的方式做吗?
Reg*_*ent 168
该NULL
对值Objective-C对象(类型id
)是nil
.
而NULL
用于C指针(类型void *
).
(最后两者最终都保持相同的值(0x0
).但它们的类型不同.)
在Objective-C中:
nil
(所有小写)是指向Objective-C对象的空指针.Nil
(大写)是指向Objective-C类的空指针.NULL
(所有大写)是指向其他任何东西的空指针(C指针,即).[NSNull null]
是不可能使用nil的情况下的单例(例如,添加/接收nil )NSArray
在Objective-C++中:
null
(小写)或nullptr
(C++ 11或更高版本)是指向C++对象的空指针.所以要检查nil
你应该明确地比较nil
(或NULL
分别):
if (getCaption == nil) ...
Run Code Online (Sandbox Code Playgroud)
还是让ObjC/ç做隐含了你:
if (!getCaption) ...
Run Code Online (Sandbox Code Playgroud)
这适用于C中的每个表达式(并且Objective-C是其超集)具有隐式布尔值:
expression != 0x0 => true
expression == 0x0 => false
Run Code Online (Sandbox Code Playgroud)
现在,当检查NSNull
这显然不起作为[NSNull null]
返回指向单例实例的指针NSNull
,而不是nil
,因此它不等于0x0
.
所以要检查NSNull
一个可以使用:
if ((NSNull *)getCaption == [NSNull null]) ...
Run Code Online (Sandbox Code Playgroud)
或(首选,见评论):
if ([getCaption isKindOfClass:[NSNull class]]) ...
Run Code Online (Sandbox Code Playgroud)
请记住,后者(使用消息调用)将返回,false
如果getCaption
恰好是nil
,虽然正式正确,可能不是您期望/想要的.
因此,如果一个(无论出于什么原因)需要检查两个 nil
/NULL
和 NSNull
,则必须将这两个检查结合起来:
if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
Run Code Online (Sandbox Code Playgroud)
有关形成等效正面检查的帮助,请参阅De Morgan定律和布尔否定.
编辑: NSHipster.com刚刚发表了一篇关于nil,null等之间细微差别的精彩文章.
lud*_*ign 24
你应该用
if ([myNSString isEqual:[NSNull null]])
这将检查对象myNSString是否等于NSNull对象.
小智 6
首选的方法来检查NSNULL
IS
if(!getCaption || [getCaption isKindOfClass:[NSNull class]])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
82391 次 |
最近记录: |