#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現(xiàn)問題
創(chuàng)新互聯(lián)擁有十多年成都網(wǎng)站建設工作經(jīng)驗,為各大企業(yè)提供成都網(wǎng)站設計、網(wǎng)站制作服務,對于網(wǎng)頁設計、PC網(wǎng)站建設(電腦版網(wǎng)站建設)、成都App制作、wap網(wǎng)站建設(手機版網(wǎng)站建設)、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、國際域名空間等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設計、網(wǎng)絡營銷經(jīng)驗,集策劃、開發(fā)、設計、營銷、管理等網(wǎng)站化運作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設項目的能力。. import會包含這個類的所有信息,包括實體變量和方法(.h文件中)
在m文件中還是需要使用#import
一般如果有繼承關系的用#import
#import比起#include的好處就是不會引起交叉編譯、
一般來說,導入objective c的頭文件時用#import,
2. 能在實現(xiàn)文件中#import,就不在頭文件中#import。
包含c/c++頭文件時用#include。
@class只是告訴編譯器,其后面聲明的名稱是類的名稱,至于這些類是如何定義的,后面會再告訴你。
2. 在頭文件中, 一般只需要知道被引用的類的名稱就可以了。 不需要知道其內部的實體變量和方法,所以在頭文件中一般使用@class來聲明這個名稱是類的名稱。 而在實現(xiàn)類里面,因為會用到這個引用類的內部的實體變量和方法,所以需要使用#import來包含這個被引用類的頭文件。
#import 就是把被引用類的頭文件走一遍,即把.h文件里的變量和方法包含進來一次,且僅一次,而@class不用,所以后者編譯效率更高。
3. 在編譯效率方面考慮,當最開始的那個頭文件有變化的話,后面所有引用它的類都需要重新編譯,如果你的類有很多的話,而是用@class則不會。
4. 如果有循環(huán)依賴關系,,如果使用#import來相互包含,那么就會出現(xiàn)編譯錯誤,如果使用@class在兩個類的頭文件中相互聲明,則不會有編譯錯誤出現(xiàn)。
3. 能在頭文件中@class+實現(xiàn)文件中#import,就不在頭文件中#import。
#include :它用于對系統(tǒng)自帶的頭文件的引用,編譯器會在系統(tǒng)文件目錄下去查找該文件.
#include "x.h":用戶自定義的文件用雙引號引用,編譯器首先會在用戶目錄下查找,然后到安裝目錄中查找,最后在系統(tǒng)文件中查找。
在使用#include的時候要注意處理重復引用
@class
主要是用于聲明一個類,告訴編譯器它后面的名字是一個類的名字,有這個類存在,而這個類的定義實現(xiàn)是暫時不用知道的,所以在后面的實現(xiàn)文件里面是需要去#import這個類,這時候才包含了這個被引用的類的所有信息,但是類是如何實現(xiàn)的不用告訴編譯器.若.m文件用到了這個類,還是要在.m文件匯總import這個類的。
#include與#import在引用一個類的時候會包含這個類的所有信息包括變量方法等,但是這樣做會對編譯效率造成影響.
在interface中引用一個類,就用@class,它會把這個類作為一個類型來使用,而在實現(xiàn)這個interface的文件中,如果需要引用這個類的實體變量或者方法之類的,還是需要import這個在@class中聲明的類。
#include <> :用于對系統(tǒng)文件的引用,編譯器會在系統(tǒng)文件目錄下去查找該文件。
#include "xx.h":用于對用戶自定義的文件的引用,編譯器首先會去用戶目錄下查找,然后去安裝目錄,最后去系統(tǒng)目錄查找。
@class
(2) 另外就是如果有循環(huán)依賴關系,如果在兩個文件的頭文件中用#import分別聲明對方,那么就會出現(xiàn)頭文件循環(huán)利用的錯誤,這時在頭文件中用@class聲明就不會出錯;
(3)還有就是自定義代理的時候,如果在頭文件中想聲明代理的話如@interface SecondViewController:UIViewController時應用#import不然的話會出錯誤,注意XXXXDelegate是自定義的。
預編譯指令
#import由gcc編譯器支持
在 Objective-C 中,#import 被當成 #include 指令的改良版本來使用。
@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,
只是@class ClassB 那就沒有include ClassB.h。僅需要在需要用到ClassB的ClassA.m文件中 #import ClassB.h
如果ClassA.h中僅需要聲明一個ClassB的指針,那么就可以在ClassA.h中聲明
@ClassB
ClassB *pointer;
在 Objective-C 中,#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現(xiàn)問題。
#import ClassB.h 相當于#include整個.h頭文件。如果有很多.m文件#import ClassA.h,那么編譯的時候這些文件也會#import ClassB.h增加了沒必要的#import,浪費編譯時間。在大型軟件中,減少.h文件中的include是非常重要的。
只是@class ClassB 那就沒有include ClassB.h。僅需要在需要用到ClassB的ClassA.m文件中 #import ClassB.h
如果ClassA.h中僅需要聲明一個ClassB的指針,那么就可以在ClassA.h中聲明@ClassB
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。