iOS-nil、Nil、NULL与NSNull的区别及应用
总结
- nil:OC中的对象的空指针
- Nil:OC中类的空指针
- NULL:C类型的空指针
- NSNull:数值类的空对象
详细解析应用如下:
1.nil
指向一个对象的指针为空 在objc.h中的定义如下所示:
#ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
在Objective-C中用于id类型的对象
NSString *name = nil; NSURL *url = nil; id object = nil;
2.Nil
指向一个类的指针为空 定义如下:
#ifndef Nil # if __has_feature(cxx_nullptr) # define Nil nullptr # else # define Nil __DARWIN_NULL # endif #endif
在Objective-C中用于Class类型的对象
Class aClass = Nil; Clsss bClass = [NSURL class];
3.NULL
指向C类型的指针为空 在stddef.h中定义如下:
#if defined(__need_NULL) #undef NULL #ifdef __cplusplus # if !defined(__MINGW32__) && !defined(_MSC_VER) # define NULL __null # else # define NULL 0 # endif #else # define NULL ((void*)0) #endif
多用于如下例子:
int *pInt = NULL; char *chChar = NULL; struct stStruct = NULL;
4.NSNull
在Objective-C中是一个类,NSNull有 + (NSNull *)null; 单例方法,多用于集合(NSArray,NSDictionary)中值为空的对象 如下
1.在集合中不能nil值,因为NSArray和NSDictionary中nil有特殊的含义 结尾
//NSArray、NSDictionary以nil结尾 NSArray *array = [NSArray arrayWithObjects: [[NSObject alloc] init], [NSNull null], @"aaa", nil, [[NSObject alloc] init], [[NSObject alloc] init], nil]; NSLog(@"%ld", array.count); // 输出 3,NSArray以nil结尾 NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: @"Object0", @"Key0", @"Object1", @"Key1", nil, @"Key-nil" @"Object2", @"Key2", nil]; NSLog(@"%@", dictionary); // 输出2个key-value,NSDictionary也是以nil结尾
但是有些时候,需要在集合中存放空值,比如个人信息中,只知道姓名,不知道电话号码,此时,有必要将电话号码设置为空,这时,就用到了NSNull。
NSNull中只有一个null方法 :[NSNull null]
[dic setObject:[NSNull null] forKey:@"phoneNumber"]; if(phoneNumber == [NSNull null]){ //... }
字典value 设置为 nil crash
//字典放value为nil 回Crash NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; [mutableDictionary setObject:nil forKey:@"Key-nil"]; // 会引起Crash
mutableDictionary =@{@"content": @"hello", @"msgExtra": @"extra", @"name": nil}// 也会会引起Crash
[mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不会引起Crash //所以在使用时,如下方法是比较安全的 [mutableDictionary setObject:(nil == value ? [NSNull null] : value) forKey:@"Key"];
如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用[NSNULL null]返回的对象来初始化NSArray中的内容。
服务器返回(null)与<null>的处理
解决方法
得到(null)后利用
if(m_result==nil) //对象指针为空 { NSLog(@"KDA!"); }
得到<null>
后利用
最常见的是服务器返回的json里面,说好的字典、数组、数字,结果返回的是空值 ,这个时候,如果是<null> NSJSONSerialization 会自动把他们换成 NSNull。当我们再去用dict[@“hello”]的时候,就会出触发exception,导致程序崩溃
if([m_result isEqual:[NSNUll null]]) //空值 { NSLog(@”KDA!”); }
还可以用runtime 给 NSNull写一个分类