之前我們分析過 #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是自定義的
版權宣告:本文為博主原創文章,未經博主允許不得轉載。