標籤:http io os ar 使用 for strong sp 檔案
很多剛開始學習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.
- Import super classes
- Import parent classes (when you have children and parents)
- 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 #import or #include when 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 aCGPoint as an ivar or property, the compiler will need to see the declaration ofCGPoint .
- Your superclass.
- A method you use.
最後,我建議還是養成良好的import習慣,不要偷懶都把import放在h檔案中,無論參與的項目大小,養成良好的編程習慣非常重要。
下面來說一下#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 SecondViewController:UIViewController時應用#import不然的話會出錯誤,注意XXXXDelegate是自訂的
iOS 中 #import同@class之間的區別