這裡列出Objective-c中獨有數據類型:
一、字符串
在Objective-c中,字符串常量是由@和一對從引號括起的字符串序列。比如:@China、@objective-c等都是合法的字符串常量。
二、id類型
id類型是Objective-c中一個比較獨特類型。
在概念上、類似Java中的Object類,可以轉換為任何數據類型。
換句話說,id類型的變量可以存放任何數據類型的對象。
在內部處理上,這種類型被定義為指向對象的指針,實際上是一個指向這種對象的實例變量的指針。
我們可以理解為id類型就是void*類型。但是它們兩個並非完全一樣。下面是id在objc.h中的定義:
[cpp]
- typedef struct objc_object {
- Class isa;
- }*id;
從上面看出,id是指向struct objc_object的一個指針。也就是說,id是一個指向任何一個繼承了Ojbect(或者NSObject)類的對象。需要注意的是id是一個指針,所以在使用id的時候不需要加星號,比如:
id n=nil;
例如:
[cpp]
- id data;
- data = person;
- [data print];
- …
- data = person1;
- [data put];
- …
三、BOOL
在objc.h中,BOOL定義為:
[cpp]
- typedef signed char BOOL;
- #define YES (BOOL)1
- #define NO (BOOL)0
從上面的定義,我們可以發現布爾變量的值是YES和NO,或0和1.
如:
[cpp]
- BOOL enable=NO;
- enable=0;
- if(enable == YES) …
- if(enable) …
- if(!enable) …
它類似於C語言中的TRUE和FALSH.
四、SEL
在Objective-c中,SEL是選擇器(selector)的一個類型。
選擇器就是指向方法的一個指針。我們可以理解為程序運行到這裡時就會執行指定的方法。
例如:
[cpp]
- SEL sel=@selector (print);
- ClassA *classA = [[ClassA alloc]init];
- ClassB *classB = [[ClassB alloc]init];
- [classA performSelector:sel withObject:nil];
- [classB performSelector:sel withObject:nil];
-
- SEL selA=@selector (print:);
- SEL selB=@selector (print:age:);
在上例中sel是指向print方法的指針,沒有指定它是屬於哪個類。因此,不同的類中都有print方法時可以調用上面的形式進行調用。
我們可以將SEL理解為函數指針,但它們之間並非完全一樣。
五、Class
與Java類似,你可以使用Class類來獲得一個對象所屬的類。如:
Class theClass = [theObject class]; //獲得theObject對象的class信息
NSLog(@類名是:%s,[theClass className]); //theObject對象的類名
Class類有幾個常用的方法,如判斷某個對象是否為某個類(包含子類)的對象:
if( [theObject isKindOfClass:[Member class]]) {…}
如果不想包含子類,就可以使用:
if( [theObject isMemberOfClass:[Member class]] {…}
六、nil和Nil
nil與C語言的NULL相同。在objc/objc.h中定義如下:
#define nil 0 /* id of Nil instance */
Nil與nil有點不一樣,Nil定義一個指向空的類(是Class,而不是對象)。具體定義如下:
#define Nil 0 /* id of Nil class */
如:
[cpp]
- ClassA *classA = [[ClassA alloc]init];
- classA = nil
-
- id data;
- data=nil;