布爾類型
C裡面的布爾類型bool具體true和false值,而objective-c裡面提供BOOL,但它的值卻是YES和NO。實際上objective-c的BOOL實際上是一種對帶符號的字元類型(singed char)的定義(typedef),它使用8位儲存空間,YES定義為1,而NO定義為0.objective-c並不將BOOL作為僅能儲存YES或NO值的真正的布爾類型來。編譯器將BOOL認做8位位元,如果一不小心將一個長於1位元組的整形值(short或int值)賦給一個BOOL變數,那麼只有低位位元組會用作BOOL值,那麼BOOL值將會是0,即NO值。比如該低位位元組剛好為0,比如8960,寫成十六進位為0x2300。
在C裡面,返回一個BOOL,有的人習慣這樣寫,假定iA和iB為兩個整數
return (iA-iB);
那麼上面一句話表示,如果不為0,則返回true。但是在objective-c裡面卻不是,因為在objective-c裡面1不等於YES。因此在使用判斷的時候,絕不要直接將BOOL值與YES比較,與NO值判斷較為明智。
枚舉、結構體的定義
與C++裡面沒有多大的區別,定義如下:
枚舉:
typedef enum
{
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
結構體:
typedef struct
{
int x, y, width,height;
ShapeType type;
} Shape;
關於id的使用
在例03.10-Shapes-Object中有下面一段代碼:
//--------------------------------------------------
// Draw the shapes
void drawShapes (id shapes[], int count)
{
inti;
for(i = 0; i < count; i++) {
idshape = shapes[i];
[shapedraw];
}
} // drawShapes
輸入參數有一個類型為id數組對象,那麼id是什麼意思?它代表identifier(標識符),它是一種泛型,用於表示任何各類的對象,id實際上是一個指標,指向某種結構。
for迴圈裡面的意思是,從id數組裡面依次得到一個id對象,並賦給shape。下面一句話
[shape draw]
是什麼意思呢?在objective-c裡同,方括弧還有一種意義:它通知某個對象該做什麼。第一項是對象,第二部分是需要對象執行的操作。在objective-c裡面,這種用通知對象執行某種操作稱為發送訊息。
類的聲明、實現與執行個體化
下面是關於MyClass的類的介面:
@interface MyClass : NSObject
{
//MyClass的各個資料成員
int iIndex;
NSString strName;
}
- (void) setIndex : (int) index;
- (void) setName : (NSString*) name;
- (void) print : (int) index: (NSString*) name;
@end //MyClass
@interface MyClass :NSObject 表明這是MyClass的定義部分,繼承於NSObject。
- (void) setIndex : (int) index;
方法的定義:“-”表示這是objective-c方法的聲明,(void)表示方法類型, “:”表示函數帶有參數,(int)是參數類型, index為參數名稱, “;”表示方法聲明結束。
如果方法帶有兩個參數,如print方法,那麼兩個參數中間用“:”來進行隔開。
@end表示類介面定義結束,而後來的注釋則是一種標記,標記MyClass定義在此結束
MyClass的實現部分:
@implementation MyClass
- (int) setIndex : (int) index
{
iIndex = index;
} //setIndex
- (void) setName : (NSString*) name
{
strName = name;
} // setName
- (void) print : (int) index: (NSString*) name
{
NSLog(@"the %d 's name is %@",index, name);
} //print
@end //MyClass
@implementation是一個編譯器指令,表示即將為MyClass提供代碼,直到@end結束。中間的方法實現可以根據interface裡面的定義來進行依次實現,也可以編寫interface裡面沒有出現的方法。
以下的代碼用來執行個體化MyClass這個類,並調用其方法:
MyClass myObj = [MyClass new];
[myObj setName: @"oneName"];
[myObj print: 5: @"oneName"];
繼承
什麼是繼承?繼承的好處是什嗎?這裡就不再介紹了,不懂的就找本物件導向的書重新學習一下。
在objective-c裡面,繼承的文法如下:
@interface MyClass :NSObject
冒號後的標識 符是需要的繼承的類,在objective-c中只能實現單繼承。
舉例:類A繼承於類B
超類:類B就可以稱為類A的超類,也稱為父類;
子類:類A是類B的子類,也稱為孩子類。
繼承的工作機制:
類A繼承於類B,類A有存在一個方法,名稱暫且稱為FunctionA,類B也有這麼一個方法,那麼調用類B的方法FunctionA時,則會執行類B本身的方法,而不是類A裡面的,因為類A的這個方法已經被類B所重寫了。
如果調用類B未重寫類A的方法時,則編譯器會先在類B中進行尋找,如果沒有重寫,則到類B的超類,也就是類A中去進行尋找,直到找到為止。
如果類B重寫了類A中的方法FunctionA,但類B的FunctionA中還想調用其超類的方法,那麼就要用到Super這個關鍵字了,如下所示
@implementation ClassB
- (void) FunctionA : (int) iValue
{
if(iVaule == 5)
iValue =10;
[super FunctionA: iValue];
}
@end
複合
編程中的複合就好像音樂中的作曲一樣:將多個組件組合在一起配合使用,從而得到完整的作品。這裡沒有什麼好講的。
但照著書上進行編碼“05.01CarParts”之後會出現一個問題,就是當你點擊Run按鈕後,程式在輸出Engine之後,會在Tire的Description函數後面停頓,然後會出現一個“Thread 1:Stopped at breakpoint 1”的提示,剛開始碰到這個的時候,我也不知道什麼原因,後來不斷的摸索,其實這並不是一個BUG,代碼本身沒問題,但是執行的時候不知道為什麼在這裡停頓了,注意,我說的是停頓,那麼辦法就是讓它繼續執行,點擊菜單“Product”->“Debug”->“Continue”然後繼續執行就可以了。
繼承在對象間建立了“is a”的關係,也就是說當A是一個B時,那麼它們之間的關係是繼承。
複合,則是一種“has a”的關係,如果A有一個B時,那麼它們之間的關係是複合。