151207 iOS之 nil null 和nsnull

来源:互联网 发布:数据营销有哪些 编辑:程序博客网 时间:2024/06/10 21:54

用了这么久还一直没有理清nil null 和nsnull之前的关系,今天终于理了一下。

先概括说一下ios里的空值, ios 里的空值主要有nil, Nil,NULL, NSNull这几个。


1.nil,Objective-C在C的表达不存在的基础上增加了nil。nil是一个指向不存在的对象指针。虽然它在语义上与NULL不同,但它们在技术上是相等的。

2.Nil,在Foundation/NSObjCRuntime.h中,Nil被定义为指向零的类指针。这个nil的鲜为人知的大写的表兄并不常常出现,但它至少值得注意。

3.NULL,C用0来作为不存在的原始值,而NULL作为指针(这在指针环境中相当于0)。

4.NSNull NSNull在Foundation和其它框架中被广泛的使用,以解决如NSArray和NSDictionary之类的集合不能有nil值的缺陷

其实只有1,和4我们程序里是经常用。

nil

  刚被分配的NSObject的内容被设置为0。也就是说那个对象所有的指向其他对象的指针都从nil开始,所以在init方法中设置self.(association) = nil之类的表达是没有必要的。

NSNull

NSNull

  NSNull 是一个代表空值的类,是一个 ObjC 对象。实际上它只有一个单例方法:+[NSNull null],一般用于表示集合中值为空的对象。


// 因为 nil 被用来用为集合结束的标志,所以 nil 不能存储在 Foundation 集合里。

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];


虽然 nil, [NSNull null] 的值相同,但使用场合不同,一般nil用来对对像付值或判断,但是如果这个对像是从集合类(NSArray, NSDictionary)中获得的就要使用,nsnull来进行判断,而不能用nil,因为nil是被用来做集合结束标志的。


如从服务器中获取的返回json数据,要获得某一个字段的值,我们可以这样来判断这个值是否为空

NSString* result = [dic objectForKey:@"key"];


这里如果这个字典里没有这个key值,我们得到的result的值是为nil,
如果有这个key,但这个key对应的value是个空,这时我们得到的result值 是有个NSNull,所以我们要正确进行判断
应该这样用
if((result != nil) &&(! [result isEqual:[NSNull null]]))
{
进行正确的操作。
}

如下面一段代码
    //构建一个json字符串    NSString* jsonString = @"{\"status\":1,\"service_name\":null,\"service_id\":null}";        NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];    NSError *err;        //从转json字符串为字典    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData                                                        options:NSJSONReadingMutableContainers                                                          error:&err];    NSLog(@"jsonString = %@", jsonString);    NSLog(@"dic = %@", dic);    NSString* service_id = [dic objectForKey:@"service_id"];    <span style="background-color: rgb(255, 0, 0);">    //这时字典中有“service_id”这个key,但是这个key对应的value是空值    //这时得到的service_id不为nil而是一个NSNull类的对像</span>    if([service_id isKindOfClass:[NSNull class]])//或 [service_id isEqualTo:[NSNull null]]    {        NSLog(@"test1 为NSNull");    }    <span style="background-color: rgb(255, 0, 0);">    //这个字典里没有service_id11111这个key,这时service_id的值为nil而不是NSNull类型</span>    service_id = [dic objectForKey:@"service_id11111"];        if(service_id == nil)    {        NSLog(@"test1 不是 NSNull,而是nil");    }


0 0
原创粉丝点击