Objective-C並不像看起來的那麼難

來源:互聯網
上載者:User

本人見識過很多的開發語言,C、C++、Java、Python、Ruby、Lua、PHP,看得多了,基本上初看一種新的語言也能很快猜出個大概這個語言的文法特點,但是初看Objective-C的時候,完全被震住了,會有一種霧裡看花的感覺!

但是通過簡單的閱讀一些文檔後,覺得Objective-C並不像外表看起來的那麼恐怖,那麼高不可攀,在此就簡單總結一下Objective-C的特點。


Objective-C特性概括


  • Objective-C是C的超集,也就是說C有的Objective-C都有,Objective-C多了C自身沒有的OO(物件導向)特性。
  • Objective-C預設副檔名為 .m 。標頭檔副檔名跟普通C一樣 .h 。
  • Objective-C推薦引入標頭檔的方式為:#import ,好處是同一個標頭檔只引入一次,而不用多餘的代碼。
  • Objective-C定義類的方法:
    @interface Person { 
        int age; 
        int hight; 

    -(int) func1; 
    -(void) func2: (int) n; 
    @end

    @interface 與 @end之間為類的定義,@interface後面 { ... } 之間定義類的成員變數,
    下面定義類的方法:(傳回值類型) 方法名:(參數類型)參數

  • Objective-C實作類別的方法:
    @implementation Person 
    -(void) func1 { 
        printf( "%i/%i", age, hight ); 

    -(void) func2: (int) n { 
        age = n; 

    @end

    @implementation 與 @end 之間為類的實現

  • 類的執行個體化:
    Person *ps = [[Person alloc] init];
    這裡【不能】像C++那樣:Person ps; 來執行個體化一個Person的變數。另Objective-C都是使用指標來操作對象的。
  • 類的方法調用:
    [ps func1]; 
    [ps func2: 10]

    前者為沒有參數的方法調用,後者為有一個參數的方法調用。
  • 多參數方法的定義及調用:
    -(void) func2: (int) n Label2: (int) m Label3: (int) p;    //此句放到 @interface @end類方法定義中 

    //下面的代碼放到 @implementation @end之間。 
    -(void) func2: (int) n Label2: (int) m Label3: (int) p{ 
        age = n; 
        height = m; 
        sth = p;  //此處第三個僅用於表達多個參數的情況,與第一個例子不一致。 

    //下面為調用代碼 
    [ps func2: 53 Label2: 89 Label3: 982];

    這裡可能很多人覺得怪異,為何後面的參數都有標籤,而第一個沒有。
    先說下什麼是標籤(像上面的Label2,Label3):標籤是用於判斷對應參數用途的一個標記,也就是如果你沒有心情可以隨便取名,當然推薦取標籤名的時候最好能反應這個參數的用途,或這個方法在當前這些參數時候的用途。
    為何第一個參數沒有標籤呢?其實你可以把第一個方法名當成是第一個參數的標籤,這樣每一個參數都有一個標籤,然後一串的參數作為【訊號】發送給對象。
    寫的時候,為了美觀,代碼整理成如下樣子:
    [ps func2: 53  
        Label2: 89  
        Label3: 982];

    這樣一個標籤對應一個參數,非常直觀。

  • 存取權限:Objective-C也像C++一樣有 public private protect 三種存取權限,預設的許可權是 protected。
    public 關鍵字修飾資源,可以在任何地方訪問。
    protected 關鍵字修飾資源,可以在類內和其子類裡訪問。
    private 關鍵字修飾資源,只能在類內訪問。
  • 外部存取類的public成員方法:
    a->publicVar = 5;   //其中 a是一個對象 publicVar是一個public的成員
  • 因為Objective-C裡面成員變數預設使用protected(如果聲明為public不太安全),也就是本類,及子類中能訪問,而外部不能直接存取,所以如果你想要外部存取或改變成員變數的值就要定義一些如 setXXX getXXX(O-C中預設是沒有get的,而直接是XXX)的方法。setXXX用來設定成員變數值,而 XXX方法用來取得成員變數的值。為了簡化操作,O-C引入了兩個關鍵字 @property 和 @synthesize。就不用寫一堆繁雜的代碼。
    //定義的時候 
    @interface Fraction: NSObject { 
        int numerator; 
        int denominator; 

    -(void) print; 

    //-(void) setDenominator: (int) d; 
    //-(int) denominator; 
    @property (retain) int denominator;   //等於上面兩句去掉注釋 

    //-(void) setNumerator: (int) n; 
    //-(int) numerator; 
    @property (retain) int numerator;   //等於上面兩句去掉注釋 
    @end

    //實現的時候 
    @implementation  

    @synthesize denominator; 
    @synthesize numerator; 

    @end

  • 聲明property的文法為:
    @property (參數) 類型 名字;

    分為三類:
    1,讀寫屬性(readwrite/readonly):顧名思義不用多說
    2,設定屬性(assign/retain/copy):assign為直接賦值,適合數實值型別的;retain最常用,一般對象都用這個代表保留;copy為複製,多用於字串。
    3,原子性atomicity(nonatomic):預設是atomic,如果是多線程的程式要保證某一個成員變數的一致性,須使用 atomic。

  • O-C中的 nil 其實是一個類型為 id 的對象,所以可以給 nil 傳遞資訊如 [nil message1]。
  • O-C中的BOOL型資料包括 YES 及 NO,而非 TRUE 及 FALSE。
  • O-C中的 Protocol 就像C++中的 介面。
    //定義定義協議 
    @protocol Printing 
    -(void) print; 
    @end 

    //引入協議 
    @interface Fraction: NSObject <Printing, NSCopying> { 
        int numerator; 
        int denominator; 

    -(Fraction*) initWithNumerator: (int) n denominator: (int) d; 
    -(void) setNumerator: (int) d; 
    -(void) setDenominator: (int) d; 
    -(void) setNumerator: (int) n andDenominator: (int) d; 
    -(int) numerator; 
    -(int) denominator; 
    @end 

    //在主檔案中只要對應實現 print這個方法就行了。

  • O-C沒有方法重載 over loading
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.