1. 程式人生 > >nil、Nil、NULL與NSNull的區別

nil、Nil、NULL與NSNull的區別

1.nil

指向一個物件的指標為空 在objc.h中的定義如下所示:
  1. #ifndef nil
  2. # if __has_feature(cxx_nullptr)
  3. #   define nil nullptr
  4. # else
  5. #   define nil __DARWIN_NULL
  6. # endif
  7. #endif
在Objective-C中用於id型別的物件
  1. NSString *name = nil;  
  2. NSURL    *url  = nil;  
  3. id object      = nil;  

2.Nil

指向一個類的指標為空 定義如下:
  1. #ifndef Nil
  2. # if __has_feature(cxx_nullptr)
  3. #   define Nil nullptr
  4. # else
  5. #   define Nil __DARWIN_NULL
  6. # endif
  7. #endif
在Objective-C中用於Class型別的物件
  1. Class aClass = Nil;  
  2. Clsss bClass = [NSURL class];  

3.NULL

指向C型別的指標為空 在stddef.h中定義如下:
  1. #if defined(__need_NULL)
  2. #undef NULL
  3. #ifdef __cplusplus
  4. #  if !defined(__MINGW32__) && !defined(_MSC_VER)
  5. #    define NULL __null
  6. #  else
  7. #    define NULL 0
  8. #  endif
  9. #else
  10. #  define NULL ((void*)0)
  11. #endif
多用於如下例子:
  1. int   *pInt     = NULL;  
  2. char *chChar <span style="white-space:pre">   </span>= NULL;  
  3. struct stStruct = NULL;   

4.NSNull

在Objective-C中是一個類,只是名字中有個Null,NSNull有 + (NSNull *)null; 
單例方法,多用於集合(NSArray,NSDictionary)中值為空的物件
  1. NSArray *array = [NSArray arrayWithObjects:  
  2.                       [[NSObject alloc] init],  
  3.                       [NSNull null],  
  4.                       @"aaa",  
  5.                       nil,  
  6.                       [[NSObject alloc] init],  
  7.                       [[NSObject alloc] init], nil nil];  
  8. NSLog(@"%ld", array.count); // 輸出 3,NSArray以nil結尾
  1. NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:  
  2.                                 @"Object0"@"Key0",  
  3.                                 @"Object1"@"Key1",  
  4.                                 nil,        @"Key-nil"
  5.                                 @"Object2"@"Key2",  
  6.                                 nil nil];  
  7. NSLog(@"%@", dictionary); // 輸出2個key-value,NSDictionary也是以nil結尾
  1. NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];  
  2. [mutableDictionary setObject:nil forKey:@"Key-nil"]; // 會引起Crash
  3. [mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不會引起Crash
所以在使用時,如下方法是比較安全的
  1. [mutableDictionary setObject:(nil == value ? [NSNull null] : value)  
  2.                       forKey:@"Key"];