Objective-C之入門文法篇

來源:互聯網
上載者:User

布爾類型

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時,那麼它們之間的關係是複合。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.