1.nil
指向一个对象的指针为空
在objc.h中的定义如下所示:
- #ifndef nil
- # if __has_feature(cxx_nullptr)
- # define nil nullptr
- # else
- # define nil __DARWIN_NULL
- # endif
- #endif
- NSString *name = nil;
- NSURL *url = nil;
- id object = nil;
2.Nil
指向一个类的指针为空
定义如下:
在Objective-C中用于Class类型的对象
- #ifndef Nil
- # if __has_feature(cxx_nullptr)
- # define Nil nullptr
- # else
- # define Nil __DARWIN_NULL
- # endif
- #endif
- 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 <span style="white-space:pre"> </span>= NULL;
- struct stStruct = NULL;
4.NSNull
在Objective-C中是一个类,只是名字中有个Null,NSNull有 + ( NSNull *)null; 单例方法,多用于集合(NSArray,NSDictionary)中值为空的对象- NSArray *array = [NSArray arrayWithObjects:
- [[NSObject alloc] init],
- [NSNull null],
- @"aaa",
- nil,
- [[NSObject alloc] init],
- [[NSObject alloc] init], nil nil];
- NSLog(@"%ld", array.count); // 输出 3,NSArray以nil结尾
- NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"Object0", @"Key0",
- @"Object1", @"Key1",
- nil, @"Key-nil"
- @"Object2", @"Key2",
- nil nil];
- NSLog(@"%@", dictionary); // 输出2个key-value,NSDictionary也是以nil结尾
- NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
- [mutableDictionary setObject:nil forKey:@"Key-nil"]; // 会引起Crash
- [mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不会引起Crash
所以在使用时,如下方法是比较安全的
- [mutableDictionary setObject:(nil == value ? [NSNull null] : value)
- forKey:@"Key"];