IOS強化知識(2)@class的運用

來源:互聯網
上載者:User

標籤:objective-c   類   前向聲明   class   編譯器   

1、為什麼使用@class


   與C++語言一樣,OC也需要一個標頭檔(h檔案),一個實現檔案(m檔案)。當你引用其他類的時候,你就需要引入標頭檔。雖然引用標頭檔沒有任何問題,但是如果你不想知道這個類的細節,只想知道它僅僅是個類的話,引用標頭檔可能顯得多餘,而且會增加編譯的時間。用@class的話,你可以不引入任何標頭檔,就能讓編譯器知道某個它是一個類。例如:

      @class B;

      @interface A:NSObject

      @property B* b;

      @end;

      

      極端情況講,如果有成千上萬個類都引入同一個標頭檔,當這個標頭檔所對應的類發生變化和改動,那麼這些引入標頭檔的類都需要重新編譯,而@class 不受此影響。


     @class還能解決一個重要的問題,就是依賴迴圈關係。即當兩個類相互引用的時候,不管你先引用哪一個標頭檔,都會出現另一個類未定義。比如:

     

       ////  A.h

      @interface A:NSObject

      @property B* b;            /////先引入A.h    B此時未定義 編譯出現錯誤

      @end;

      

       ////  B.h

      @interface B:NSObject

      -(void)setFriend:(A*)a;        ////先引入B.h     A此時未定義 編譯出現錯誤

      @end;

     我們通過@class 輕鬆解決這個問題

     

       ////  A.h

      @class B;

      @interface A:NSObject

      @property B* b;            /////前向聲明B    編譯通過

      @end;

      

       ////  B.h

       #import "A.h"

      @interface B:NSObject

      -(void)setFriend:(A*)a;        ////引入A.h  A被聲明,編譯通過    註:A類也可以進行前向聲明

      @end;



2、有時候必須引入標頭檔

    

       當你需要繼承的時候,你必須引入標頭檔,知道其完整的定義。當你實現某個協議的時候,同樣的道理。所以我們最好把協議單獨放在一個標頭檔裡。


       當然最好還是能不引入標頭檔就不引入,如果需要引入一些標頭檔的時候,也可以考慮放到分類(category)中,這樣的好處是增加編譯的效率和降低類之間的耦合。



今天要點:

除非有必要,否則不引入標頭檔。這樣做可以降低耦合,減少編譯時間。

無法前向聲明時,盡量把引入標頭檔的操作放到category中。

IOS強化知識(2)@class的運用

聯繫我們

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