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
首选的方法来检查NSNULLIS
if(!getCaption || [getCaption isKindOfClass:[NSNull class]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82391 次 |
| 最近记录: |