天天看點

Objective-C資料類型之id,SEL,BOOL,nil,NULL和NSNull1 前言2 詳述3 結語

1 前言

對于新接觸Objective-C的新手們來說,資料類型應該是最基礎不過的了,對于Objective-C的基本資料類型,了解多少,今天我們就來介紹一下。

2 詳述

2.1 id

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

2.2 SEL

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

[object performSelector:@selector(doSometing)];
           

等價于:

[object doSometing];
           

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

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

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

2.3 BOOL

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

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

2.4 nil,NULL和NSNull

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

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

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

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

id someObject = [[Object alloc] init];
//...
[someObject release];
//...
if(someObject){
	//crash here
}
           

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

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

3 結語

以上就是所有内容,希望對大家有所幫助。

繼續閱讀