Obj-C是C語言的超集,之前我們都知道了,所以Obj-C中的數據類型分爲兩種:一種是基於C語言的基本數據類型;另一種是Obj-C特殊的數據類型。
1. C語言基本數據類型
Obj-C基於C語言的基本數據類型有:int,float,double和char,那麼我們來看下書上的一個比較全面的例子,包括各個類型的賦值和輸出。
- #import <Foundation/Foundation.h>
- int main (int argc,char *argv[])
- {
- NSAutoreleasePool * pool=[[NSAutorreleasePool alloc] init]; //聲明對象釋放池
- int integerVar=100; //聲明int變量
- float floatingVar=331.79; //聲明float變量
- double doubleVar=8.44e+11; //聲明double變量
- char charVar='W'; //聲明char變量
- NSLog (@"integerVar=%i",integerVar); //使用NSLog函數輸出
- NSLog (@"floatingVar=%f",floatingVar); //使用NSLog函數輸出
- NSLog (@"doubleVar=%e",doubleVar); //使用NSLog函數輸出
- NSLog (@"doubleVar=%g",doubleVar); //使用NSLog函數輸出
- NSLog (@"charVar=%c",charVar); //使用NSLog函數輸出
- [pool drain]; //釋放對象釋放池
- return 0;
- }
integerVar=100
floatingVar=331.79009
doubleVar=8.440000e+11
doubleVar=8.44e+11
charVar='W'
還有一些C語言裏也有的數據類型:
Long型
Long long型
Short型
Unigned型
signed型
2. Obj-C的特殊數據類型
除了上面列出的常用數據類型以外,Obj-C還提供了幾個比較特殊的數據類型:id、BOOL、nil、SEL、YES和NO
(1)在Obj-C中id可以用來標識任何類的對象,那麼實際上id是一個指針,並且指向一個類結構體,定義如下所示:
Typedef struct objc_object{
Class isa;
}*id;
那麼我們可以把id當成C語言的void*來理解,可以用它來映射任何對象類型,並且可以給它傳任何消息,如果傳遞給它的消息它不支持的話,就會返回異常。我們還是參照書上的一個例子來看下id的用法:
- id object; //聲明一個id類型的對象
- object=[[Car alloc] init];//實例化一個Car的對象並且傳遞給object,此時object是Car的對象
- [object run]; //調用Car的run方法
- object=[[Bike alloc] init]; //實例化一個Bike對象並傳遞給object,此時object是Bike的對象
- [object run]; 調用Bike的run方法
(2)BOOL類型等同於C/C++中的bool類型,即其值只能是真(true)或假(false)。
BOOL類型的定義如下:
Typedef signed char BOOL
Obj-C中的真和假的關鍵字是YES和NO,其實也就相當於我們常用的其他語言中的true和false。
YES和NO的定義如下:
#define YES (BOOL) 1
#define YES (BOOL) 0
那麼我們還是看一個實例:
- BOOL isFinished=NO;//聲明一個BOOL變量並賦初始值爲假
- if(isFinished) //如果爲真就執行括號中的語句
- {
- }
- isFinished=YES; //將isFinished變量賦值爲真
- if(isFinished) //此時isFinished爲真,執行下面括號裏的語句
- {
- }
(3)nil代表一個空對象,相當於我們其他語言裏的NULL,在Obj-C中nil表示一個Objective-C對象的指針指向空,我們看一個實例:
- Car * myCar=nil;//聲明一個Car的變量並且賦值爲空,此時myCar相當於空對象
- if(myCar) //判斷myCar對象是否爲空,如果爲空就執行startEngine方法
- {
- [myCar startEngine];
- }
那麼如果我們直接去掉if判斷條件,在Obj-C中是不會做任何操作的,因爲Obj-C中如果一個空對象調用任何方法,都是不會做任何操作的,但是像其他的語言中,比如C\C++\Java\C#等,這樣兒做是會報錯的。
(4)SEL是selector的一個類型,,代表一個方法,等同於C語言中的函數指針,下面的這個例子說明SEL是如何使用的。
- SEL oneMethod=@selector(render);//聲明一個SEL變量,並且賦值爲方法render的指針
- [oneObject performSelector: oneMethod];//假設oneObject已經實例化,執行render方法
@selector關鍵字是Obj-C語言中專屬的關鍵字,作用就是得到一個方法指針。上面的例子中傳入名字爲render的方法,使得oneMethod成爲指向render方法的指針。oneObject假設是已經實例化的對象,通過調用performSelector方法來執行render方法,那麼這裏的performSelector方法是NSObject類中實現的方法,因爲每個Obj-C類都是繼承自NSObject類,所以所有實例化之後的對象都可以調用此方法。