之前我們分析過 #include 和 #import 的區別,#import不會引起交叉編譯,#import 確定一個檔案只能被匯入一次,使在遞迴包含中不會出現問題。

那麼 #import 和 @class 又有什麼區別呢?

(1)從實質上來說。

@class 和 #import 都是引入類的資訊。



而不同的是 #import 會包含引入類的所有資訊,包括實體變數和方法。



而 @class 一般是在標頭檔案中使用的,因為他只告訴編譯器,宣告的類的名稱,只是將這個類作為一個型別來用的(比如 Dog類的標頭檔案中引入了 @class Animal; ,那麼我們只是可以建立一個Animal型別的例項變數,如: Animal *ani;   )。至於引入類(Animal)中是如何定義的(定義了哪些例項變數和方法),是不知道的。所以在標頭檔案中如果用 @class 宣告某個類後,在.m的實現中如果用到類的具體方法或例項變數時還得再 #import類 一下。



(2)從編譯時間上來說。(是編譯時的時間,並非執行時的時間)



在.h標頭檔案中進行宣告時用 #import 的話,如果有許多類都 #import 同一個類,或者這些檔案是依次引用同一個類的話,當引用的那個類的標頭檔案有變化後進行編譯時,後面所有引用它的類都需要重新編譯,那麼這將耗費大量的時間。



而用 @class 則不會耗費太多時間,用@class只是簡單的告訴編譯器有這個類,將這個類作為一個型別來用,讓編譯順利通過就好了。如果在.m檔案中還需要用引入類的例項變數和方法的的話,再 #import 一下類就好了。編譯器編譯的時候是隻編譯標頭檔案的,所以在.m中用 #import 與編譯時間沒太大關係。從而會節約編譯的時間。



(3)幾個情況說明。



  ①一般如果有繼承關係的用 #import。



  ② 另外就是如果有迴圈依賴關係,如:A->B,B->A這樣相互依賴時,如果在兩個檔案的標頭檔案中用#import分別宣告對方,那麼就會出現標頭檔案迴圈利用的錯誤,這時在標頭檔案中用@class宣告就不會出錯



  ③還有就是自定義代理的時候,如果在標頭檔案中想宣告代理的話,如

@interface SecondViewController:UIViewController<XXXDelegate>時 應該應用#import,不然的話會出錯誤,注意XXXXDelegate是自定義的

版權宣告:本文為博主原創文章,未經博主允許不得轉載。