Objective-c nil, Nil, NULL和NSNull的區別

來源:互聯網
上載者:User

標籤:blog   http   io   ar   for   sp   strong   資料   div   

在OC中可能經常會遇到 nil,Nil,NULL和NSNull,下面分析一下之間的區別:

 

Symbol Value Meaning
NULL (void *)0 literal null value for C pointers
nil (id)0 literal null value for Objective-C objects
Nil (Class)0 literal null value for Objective-C classes
NSNull [NSNull null] singleton object used to represent null

 

一、nil:對象為空白

定義某一執行個體對象為空白值。例如:

 

[objc] view plaincopy 
  1. NSObject* obj = nil;  
  2.         if (nil == obj) {  
  3.             NSLog(@"obj is nil");  
  4.         }  
  5.         else {  
  6.             NSLog(@"obj is not nil");  
  7.         }  

 

 

二、Nil:類為空白

定義某一類為空白。例如:

 

[objc] view plaincopy 
  1. Class someClass = Nil;  
  2.         Class anotherClass = [NSString class];  

 

 

三、NULL:基本資料對象指標為空白

用於c語言的各種資料類型的指標為空白。例如:

 

[objc] view plaincopy 
  1. intint *pointerToInt = NULL;   
  2. charchar *pointerToChar = NULL;   
  3. struct TreeNode *rootNode = NULL;  

 

 

四、NSNull

集合對象無法包含 nil 作為其具體值,如NSArray、NSSet和NSDictionary。相應地,nil 值用一個特定的對象 NSNull 來表示。NSNull 提供了一個單一執行個體用於表示對象屬性中的的nil值。

 

[objc] view plaincopy 
  1. @interface NSNull : NSObject <NSCopying, NSSecureCoding>  
  2.   
  3. + (NSNull *)null;  
  4.   
  5. @end  

 

在NSNull單例類中,提供了唯一的方法null:Returns the singleton instance of NSNull.

例如:

 

[objc] view plaincopy 
  1. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];  
  2.        mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey`  
  3.        NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]  



 

五、說明:

Technically they‘re all the same, but in practice they give someone reading your code some hints about what‘s going on; just like naming classes with a capital letter and instances with lowercase is recommended, but not required.

If someone sees you passing NULL, they know the receiver expects a C pointer. If they see nil, they know the receiver is expecting an object. If they see Nil, they know the receiver is expecting a class. Readability.

 

六、注

下面附帶幾個有趣的例子:

(1)

 

[objc] view plaincopy 
  1. NSObject *obj1 = [[NSObject alloc] init];  
  2.         NSObject *obj2 = [NSNull null];  
  3.         NSObject *obj3 = [NSObject new];  
  4.         NSObject *obj4;  
  5.         NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];  
  6.         NSLog(@"arr1 count: %ld", [arr1 count]);    //arr1 count: 3  
  7.   
  8.   
  9.         NSObject *obj1;  
  10.         NSObject *obj2 = [[NSObject alloc] init];  
  11.         NSObject *obj3 = [NSNull null];  
  12.         NSObject *obj4 = [NSObject new];  
  13.         NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];  
  14.         NSLog(@"arr2 count: %ld", [arr2 count]);   //arr2 count: 0  


為啥第一個數組元素有三個,而第二個數組元素為0.先看看:

 

 

[objc] view plaincopy 
  1. NSObject* obj;  
  2.         if (nil == obj) {  
  3.             NSLog(@"obj is nil");  
  4.         }  
  5.         else {  
  6.             NSLog(@"obj is not nil");  
  7.         }  

這個輸出:obj is nil。而NSArray是以nil結尾的。所以知道原因了吧!

 

(2)

 

[objc] view plaincopy 
    1. //有異常!  
    2.         NSObject *obj1 = [NSNull null];  
    3.         NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];  
    4.         for (NSString *str in arr1) {  
    5.             NSLog(@"array object: %@", [str lowercaseString]);  
    6.         }  
    7.   
    8.         //修改  
    9.         NSObject *obj1 = [NSNull null];  
    10.         NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];  
    11.         for (NSString *str in arr1) {  
    12.             if (![str isEqual:[NSNull null]]){  
    13.                 NSLog(@"array object: %@", [str lowercaseString]);  
    14.             }  
    15.         }   

Objective-c nil, Nil, NULL和NSNull的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.