nil、Nil、NULL與NSNull的區別
阿新 • • 發佈:2019-02-11
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
指向一個類的指標為空 定義如下:- #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 *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"];