(iPhone/iPad)NSString中让人费解的nil和NSNull,待解惑

今天在用到NSString类的时候遇到一个问题,挺费解的,问题是这样的:我从服务器上获取某字符串数据,考虑到有些对象不含这个字符串变量,我在使用时先判断该字符串是否为空,例如:

假设,这个字符串名叫str,

先判断if(str!=nil){

//do something

double data=[str doubleValue];

}

但是,当数据为空时依旧报错,错误内容如下:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull doubleValue]: unrecognized selector sent to instance 0x2b4ccd8' *** First throw call stack: (0x2ab6052 0x28d6d0a 0x2ab7ced 0x2a1cf00 0x2a1cce2 0x14ff1c 0x14e93c 0x10cdf1 0x105c88 0x133b40 0x135935 0x1532548 0x1534722 0x13e47c7 0x13e42c1 0xd1e3d66 0x13e728c 0x13e72b8 0x13e79ab 0x13ec288 0xd1e3ece 0xb5262 0xcf55f 0xb72c3 0x141d64e 0x141cc1c 0x144356d 0x142dd47 0x1444441 0x14444f9 0x163bc68 0x13fb4a1 0x13fc12b 0x163b4c7 0x1424427 0x142458c 0xd1fe280 0x14245cc 0xecdaf 0xf14e2 0xecb9d 0xd5d0e 0x135e88 0x107098 0x12d870 0x2ab7ec9 0x135a5c2 0x135a55a 0x13ffb76 0x140003f 0x13ff2fe 0x137fa30 0x137fc56 0x1366384 0x1359aa9 0x28b9fa9 0x2a8a1c5 0x29ef022 0x29ed90a 0x29ecdb4 0x29ecccb 0x28b8879 0x28b893e 0x1357a9b 0x18656 0x2be5 0x1) terminate called throwing an exception
显示[NSNull doubleValue]...也就是说,我之前在if中判断(str!=nil)并不足以判断NSNull...这是为什么?nil和NSNull又有什么区别???


当我查看苹果官方文档时,有这么一个代码:

id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
    NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}
// output: "equals NSNull instance"

虽然最后我的问题解决了,我在if判断中用

 
 
if(![tmpNewsModel.latitude isEqual:[NSNull null]]){
     //do something
}


问题是解决了,但是还不太理解nil和NSNull的区别?今天时间不太够,先记下这个问题,有时间想想这个区别!

你可能感兴趣的:(c,exception,服务器,null,equals,output)