很多剛開始學習iOS開發的同學可能在看別人的代碼的時候會發現有部分#import操作寫在m文件中,而h文件僅僅使用@class進行聲明,不禁納悶起來,為什麼不直接把#import放到h文件中呢?
這是因為h文件在修改後,所有import該h文件的所有文件必須重 新build,因此,如果把#import寫在h文件中,import該h文件的文件也就會產生不必要的編譯,增加編譯時間,特別是在項目文件多的情況 下。想象一下,如果只是修改一個h文件而導致上百個文件不必要的編譯,那是一件多麼讓人糾結的事情。。。
對於@class只是告訴編譯器有這個class,請不要報錯或警告,因此不會給編譯造成影響。
什麼時候用@class這種方式聲明比#import好呢?
stackoverflow上的高手們給了不少建議:
Randy Marsh:
When I develop, I have only three things in mind that never cause me any problems.
1. Import super classes
2. Import parent classes (when you have children and parents)
3. Import classes outside your project (like in frameworks and libraries)
For all other classes (subclasses and child classes in my project self), I declare them via forward-class.
Justin:
Simple answer: You#importor#includewhen there is a physical dependency. Otherwise, you use forward declarations (@class MONClass,struct MONStruct,@protocol MONProtocol).
Here are some common examples of physical dependence:
• Any C or C++ value (a pointer or reference is not a physical dependency). If you have aCGPointas an ivar or property, the compiler will need to see the declaration ofCGPoint.
• Your superclass.
• A method you use. (樓主英文不好,希望大牛自行翻譯)
下面來說一下#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與編譯時間沒太大關系
3.接下來說說什麼時候該用@class,什麼時候該用#import進行聲明,
(1)一般如果有繼承關系的用#import,如B是A的子類那麼在B中聲明A時用#import
(2) 另外就是如果有循環依賴關系,如:A->B,B->A這樣相互依賴時,如果在兩個文件的頭文件中用#import分別聲明對方,那麼就會出現頭文件循環利用的錯誤,這時在頭文件中用@class聲明就不會出錯
(3)還有就是自定義代理的時候,如果在頭文件中想聲明代理的話如@interface