使用OC編程的時候,若是要使用其餘的類或者數據源,都須要使用#import導入對應的頭文件,可是若是不理解import和@class的區別,不單單可能會形成性能低下,更可能會致使程序崩潰,下面咱們就來講說@class
關鍵字和#import
的用法及區別。編程
區別性能
1. #import會包含這個類的全部信息,包括實體變量和方法,而@class只是告訴編譯器,其後面聲明的名稱是類的名稱。spa
2. 在頭文件中, 通常只須要知道被引用的類的名稱就能夠了。 不須要知道其內部的實體變量和方法,因此在頭文件中通常使用@class來聲明這個名稱是類的名稱。 而在實現類(.m)裏面,由於會用到這個引用類的內部的實體變量和方法,在類的實現文件裏須要使用#import來包含這個被引用類的頭文件。.net
3.從編譯效率方面考慮,若是你有100個頭文件都#import了同一個頭文件,或者這些文件是依次引用的,如A–>B, B–>C, C–>D這樣的引用關係。當最開始的那個頭文件有變化的話,後面全部引用它的類都須要從新編譯,若是你的類有不少的話,這將耗費大量的時間。而是用@class則不會。code
4. 若是有循環依賴關係,如:A–>B, B–>A這樣的相互依賴關係,若是使用#import來相互包含,那麼就會出現編譯錯誤,若是使用@class在兩個類的頭文件中相互聲明,則不會有編譯錯誤出現。get
有時,使用@class申明,編譯器會給出這樣的告警:編譯器
warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.it
這是由於在頭文件(.h)中可使用@class,意思是說,暫時申明瞭某個類,但還不會用到類中的成員變量及實現。在實現的時候會用到成員變量及實現了,可是沒有#import這個類,故沒法獲取該類的成員變量及實現。編譯