@class #import #include辨析

#include
        區分 #include <x.h>與#include "x.h"的做用
        
#include <x.h>:它用於對系統自帶的頭文件的引用,編譯器會在系統文件目錄下去查找該文件 .
          #include "x.h":用戶自定義的文件用雙引號引用,編譯器首先會在用戶目錄下查找,而後到安裝目錄中查找,最後在系統文件中查找。
         在使用#include的時候要注意處理重複引用(這也是objc中#include與#import的區別)
        例如:ClassA 與 ClassB同時引用了ClassC,不作重複引用處理的時候在ClassB中同時引用ClassA,ClassB編譯會提示對ClassC重複引用的錯誤.
         咱們能夠在ClassC中:#ifndef _CLASSC_H
                       #define _CLASSC_H
                       #include "ClassC"
                       #endif
         這樣處理在編譯時就不會有重複引用的錯誤出現(在objc中#import解決了這個問題,這是它們的區別)
#import
         #import 大部分功能和#include是同樣的,可是他處理了重複引用的問題,咱們在引用文件的時候不用再去本身進行重複引用處理.
@class
        主要是用於聲明一個類,告訴編譯器它後面的名字是一個類的名字,而這個類的定義實現是暫時不用知道的,後面會告訴你.也是由於在@class僅僅只是聲明一個類,因此在後面的實現文件裏面是須要去#import這個類,這時候才包含了這個被引用的類的全部信息。

綜上所述#include,#import與@class的區別能夠作一下理解

          #include與#import在引用一個類的時候會包含這個類的全部信息包括變量方法等,可是這樣作會對編譯效率形成影響.好比有99個類都#import了ClassA,那麼在編譯的時候這99個類都會去對ClassA處理.又好比A被B引用,B被C引用,C被D引用.....此時若是A被修改,那麼後面的B,C,D.....都須要從新進行編譯.還有一個用法會引發編譯錯誤的就是在ClassA中#import ClassB 在ClassB中#import ClassA那麼在編譯的時候也會出現未知錯誤。
        因此通常來講,在interface中引用一個類,就用@class ,它會把這個類做爲一個類型來使用,而在實現這個interface的文件中,若是須要引用這個類的實體變量或者方法之類的,仍是須要import這個在@class中聲明的類。
即:.h文件用@class來聲明,.m中若是須要引用這個類的實體變量或者方法之類的,就import
1. import會包含這個類的全部信息,包括實體變量和方法,而@class只告訴編譯器,聲明的類的名稱,至於這些類是如何定義的,暫時不用考慮,因此在頭文件中若是用@class聲明某個類後,在.m的實現中若是用到聲明類的具體方法或變量時還得再#import類  。
 2.在.h頭文件中進行聲明時用#import的話,若是100個頭文件都#import同一個頭件,或者這些文件是依次引用的,如A->B,B->C,C->D,當最開始的那個頭文件有變化後進行編譯時,後面全部引用它的類都須要從新編譯,若是引用最開始的頭文件的類不少的話,那麼這將耗費大量的時間,而用@class則不會,可能有人會想即然.h只是用@class只是簡單的一個聲明告編譯器有這個類不讓其報錯,那麼.m中要用到引入的類的方法和屬性時,不仍是要#import頭文件一次,是的這個是對的,但 編譯器編譯的時候只編譯頭文件的,因此你的.m中用#import與編譯時間沒太大關係

總結:
   1.通常若是有繼承關係的用#import,如B是A的子類那麼在B中聲明A時用#import
   2. 另外就是若是有循環依賴關係,如:A->B,B->A這樣相互依賴時,若是在兩個文件的頭文件中用#import分別聲明對方,那麼就會出現頭文件循環利用的錯誤,這時在頭文件中用@class聲明就不會出錯
   3.還有就是自定義代理的時候,若是在頭文件中想聲明代理的話如@interface SecondViewController:UIViewController時應用#import否則的話會出錯誤,注意XXXXDelegate是自定義的
  
相關文章
相關標籤/搜索