解析:ios
不少剛開始學習iOS開發的同窗可能在看別人的代碼的時候會發現有部分#import操做寫在 .m 文件中,而 .h 文件僅僅使用@class進行聲明,不由納悶起來,爲何不直接把#import放到h文件中呢?學習
這是由於 .h 文件在修改後,全部 #import 該 .h 文件的全部文件必須重 新Build,所以,若是把 #import 寫在 .h 文件中,#impor t該 .h 文件的文件也就會產生沒必要要的編譯,增長編譯時間,特別是在項目文件多的狀況 下。想象一下,若是隻是修改一個 .h 文件而致使上百個文件沒必要要的編譯,那是一件多麼讓人糾結的事情。。。對於@class只是告訴編譯器有這個class,請不要報錯或警告,所以不會給編譯形成影響。ui
下面來講一下#import同class之間的區別代理
在ios中咱們常常會在.h和.m中引入一些類啊等等通常用的是#import來進行聲明,大家可能也見到在.h文件進用@class來聲明的,那麼#import和@class進行聲明 到底有什麼的區別呢?繼承
1. import會包含這個類的全部信息,包括實體變量和方法,而@class只告訴編譯器,聲明的類的名稱,至於這些類是如何定義的,暫時不用考慮,因此在頭文件中若是用@class聲明某個類後,在.m的實現中若是用到聲明類的具體方法或變量時還得再#import類 。開發
2.在.h頭文件中進行聲明時用#import的話,若是100個頭文件都#import同一個頭件,或者這些文件是依次引用的,如A->B,B->C,C->D,當最開始的那個頭文件有變化後進行編譯時,後面全部引用它的類都須要從新編譯,若是引用最開始的頭文件的類不少的話,那麼這將耗費大量的時間,而用@class則不會,可能有人會想即然.h只是用@class只是簡單的一個聲明告編譯器有這個類不讓其報錯,那麼.m中要用到引入的類的方法和屬性時,不仍是要#import頭文件一次,是的這個是對的,但編譯器編譯的時候只編譯頭文件的,因此你的.m中用#import與編譯時間沒太大關係get
接下來講說何時該用@class,何時該用#import進行聲明編譯器
1.通常若是有繼承關係的用#import,如B是A的子類那麼在B中聲明A時用#importio
2. 另外就是若是有循環依賴關係,如:A->B,B->A這樣相互依賴時,若是在兩個文件的頭文件中用#import分別聲明對方,那麼就會出現頭文件循環利用的錯誤,這時在頭文件中用@class聲明就不會出錯編譯
3.還有就是自定義代理的時候,若是在頭文件中想聲明代理的話如@interface SecondViewController:UIViewController時應用#import否則的話會出錯誤,注意XXXXDelegate是自定義的
在分析 #Imclude 和 #include的用法