Objective-C資料類型之id,SEL,BOOL,nil,NULL和NSNull

來源:互聯網
上載者:User

標籤:

 id

id是指向Objective-C對象的指標,等價於C語言中的void*,可以映射任何對象指標指向他,或者映射它指向其他的對象。常見的id類型就是類的delegate屬性。

SEL

SEL類型是Objective-C用來定義方法的關鍵字,但卻從不屬於任何類執行個體,其值是通過@selector進行計算,可以把她當做一個函數指標來使用,但實際上的類型是const char*。SEL類系可以在編譯時間通過@selector()直接建立,也可以用NSSelectorFromString()函數建立,這個函數允許通過名字調用方法,代碼如下:

  1. [object performSelector:@selector(doSometing)];  

 

等價於:

  1. [object doSometing];  

 

Objective-C的對象可以接受任何訊息,當不一定能夠響應訊息,所以在編碼中通常可以通過respondsToSelector()函數判斷對象是否可以相應某個訊息,從而保護代碼:

  1. NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];  
  2. SEL chilidSelector = NSSelectorFormString(childSelectorName);  
  3. if([self repondsToSelector:chilidSelector]){  
  4.     [self performSelector:chilidSelector withObject:aChild];  
  5. }  

 

如果不進行保護,而對象沒有相應的方法進行響應,程式就會跑出運行時異常。

BOOL

在Objective-C中的布爾類型是BOOL,其值可以使YES或NO,也可以賦值為TRUE和FLASE。YES和TRUE等價,都是非零值;NO和FALSE等價,都是零值。子啊調用時候可以通過列印數位方式輸出其值,代碼如下:

  1. NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];  
  2. SEL chilidSelector = NSSelectorFormString(childSelectorName);  
  3. if([self repondsToSelector:chilidSelector]){  
  4.     [self performSelector:chilidSelector withObject:aChild];  
  5. }  

 

 nilNULLNSNull

注意:控制處理不當是引起程式錯誤乃至崩潰的重要原因之一。

因為Objective-C的集合對象,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull對象,所以,如果一線代碼中的item為NUNull,則會引起程式崩潰:

  1. NSString *item = [NSArray objectAtIndex:i];  
  2. if([item isEqualToString:@"TestNumber"]){  
  3.     //  
  4. }  

以下代碼是常見的錯誤,release對象沒有設定為nil,從而引起程式崩潰。

  1. id someObject = [[Object alloc] init];  
  2. //...  
  3. [someObject release];  
  4. //...  
  5. if(someObject){  
  6.     //crash here  
  7. }  

nil用來給對象賦值(Objective-C的任何對象都屬於id類型),NULL則給任何指標賦值,NULL和nil不能互換,nil用於類指標賦值(在Objective-C中類的一個對象,是類的meta-class的執行個體),而NSNull則用於結合操作,雖然他們表示的都是控制,但使用場合完全不同,所以在編碼時嚴格按照變數類型來賦值,將正確的空值賦給正確的類型,是代碼易於閱讀和維護,也不易引起錯誤。

Objective-C有個特性,就是當發送訊息給nil對象時,系統返回0值而不是引起異常,因為nil是對象的合法值,nil對象同樣可以接受訊息。

nil

nil 是 ObjC 對象的字面空值,對應 id 類型的對象,或者使用 @interface 聲明的 ObjC 對象。

Nil

Nil 是 ObjC 類類型的書面空值,對應 Class 類型對象。

NULL

 NULL 是任意的 C 指標空值。

NSNull

 NSNull 是一個代表空值的類,是一個 ObjC 對象。實際上它只有一個單例方法:+[NSNull null],一般用於表示集合中值為空白的對象。

1.nil

指向一個對象的指標為空白objc.h中的定義如下所示:

Objective-C中用於id類型的對象

NSString *name = nil;

NSURL    *url  = nil;

id object      = nil;

2.Nil

指向一個類的指標為空白  定義如下:

Objective-C中用於Class類型的對象

Class aClass = Nil;

Clsss bClass = [NSURL class];

3.NULL

指向C類型的指標為空白stddef.h中定義如下:

多用於如下例子:

int   *pInt     = NULL;

char *chChar = NULL;

struct stStruct = NULL; 

4.NSNull

Objective-C中是一個類,只是名字中有個NullNSNull + (NSNull *)null; 單例方法,多用於集合(NSArray,NSDictionary)中值為空白的對象

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結尾

NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];

[mutableDictionary setObject:nil forKey:@"Key-nil"]; // 會引起Crash       就是遇到未知問題,那個程式運行出錯退出了。crash是崩潰的意思[mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不會引起Crash

所以在使用時,如下方法是比較安全的

[mutableDictionary setObject:(nil == value ? [NSNull null] : value)forKey:@"Key"];

 

Objective-C資料類型之id,SEL,BOOL,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.