標籤:
id
id是指向Objective-C對象的指標,等價於C語言中的void*,可以映射任何對象指標指向他,或者映射它指向其他的對象。常見的id類型就是類的delegate屬性。
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];
- }
如果不進行保護,而對象沒有相應的方法進行響應,程式就會跑出運行時異常。
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];
- }
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對象同樣可以接受訊息。
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中是一個類,只是名字中有個Null,NSNull有 + (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