OC當中特有的文法,OC特有文法

來源:互聯網
上載者:User

OC當中特有的文法,OC特有文法
一、分類Category

1.什麼是分類

>分類:可以在不改變原有類前提的情況下,拓展很多新方法,但是不能拓展新的成員變數。

    如果想要擴充新的成員變數,可以考慮使用繼承。

2.分類的書寫形式

>1),分類標頭檔:

    @interface 原有類 (分類名稱)

    // 方法聲明

    @end

> 2),分類的實現檔案:

    @implementation 原有類 (分類名稱)

    // 分類聲明中的方法的實現

    @end

3.使用注意

分類使用注意:

      1),在分類中不能訪問原始類primary中@private範圍的成員變數

      2),如果分類實現了和原始類同名的方法,會覆蓋原始類的這個方法,是的原始類的這個方法無法被調用

      3),如果多個分類都實現了和原始類同名的方法,那麼會優先調用分類的這個方法,而且是最後參加編譯的那個優先順序更高。

          (也就是:分類(最後參與編譯的優先)-->原始類-->原始類的父類)

            所以,最好不好在分類中實現和原始類同名的方法

4.分類的好處

     1), 可以將一個很大的項目分模組進行開發,減小項目的複雜性。

     2),很多的功能被分散到不同的類中,由團隊不同成員開發,增強團隊合作性。

5.相關的操作

  1)在Xcode 6.3版本中可以用快速鍵 command + N 選擇OS X下面的Objective-C File 建立相對應類的分類,進入項目中,不喜歡使用快速鍵的可以按照File-->NEW-->File..來選擇相應的檔案操作。

  2)建立的分類的聲明和實現形如:

// 分類的聲明

#import "Father.h"@interface Father (Work)//{//    int age; // 分類不能擴充成員變數//}- (void)work;//- (void)walk;@end

// 分類的實現

#import "Father+Work.h"@implementation Father (Work)//原始類+分類名字- (void)work{//    NSLog(@"名字是%@的father在工作", _name); // 在分類中不能直接存取原有類中@private範圍的成員變數    NSLog(@"名字是%@的father在工作", self.name);}- (void)walk{    NSLog(@"名字是%@的father+work在走路", self.name);}@end

 

二、類的本質

1. 類也是個對象

> 其實類也是一個對象,是Class類型的對象,可以簡稱為“類對象”

  在Xcode中按住command鍵滑鼠放在class點進去會發現原來class真正的面貌:

1 #if !OBJC_TYPES_DEFINED2 /// An opaque type that represents an Objective-C class.3 typedef struct objc_class *Class;4 5 /// Represents an instance of a class.6 struct objc_object {7     Class isa  OBJC_ISA_AVAILABILITY;8 };

  上述是Class類型的定義。

>類名就代表著類對象,每個類只有一個類對象。

>相關配圖

2.+load 和 +initialize

>  +load

  在程式啟動的時候會載入所有的類和分類,並調用所有類和分類的+load方法

  先載入父類,再載入子類;也就是先調用父類的+load,再調用子類的+load

  先載入元原始類,再載入分類

  不管程式運行過程有沒有用到這個類,都會調用+load載入

>  +initialize

   在第一次使用某個類時(比如建立對象等),就會調用一次+initialize方法

   一個類只會調用一次+initialize方法,先調用父類的,再調用子類的

  定義了一個Animal類,並讓Cat繼承於Animal用於示範 +load 和 +initialize

 1 #import "Animal.h" 2  3 @interface Cat : Animal 4 - (void)quickEat; 5 @end 6  7 @implementation Cat 8 + (void)load 9 {10     NSLog(@"Cat + load");11 }12 13 + (void)initialize14 {15     NSLog(@"Cat + initialize");16 }17 18 - (void)quickEat19 {20     NSLog(@"cat - eat");21 }22 23 @end24 // 輸出結果 2015-08-27 07:28:51.047 03類的本質和初始化[1918:162703] Cat + load 2015-08-27 07:28:51.047 03類的本質和初始化[1918:162703] Cat + initialize

 

聯繫我們

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