如何使用#import #include與@class

一、#include與#import區(qū)別

1. #include <xxx.h>

2. #import <xxx.h>

用于對(duì)系統(tǒng)自帶的頭文件的引用香府,編譯器會(huì)在系統(tǒng)文件目錄下查找該文件董栽。

3. #include "xxx.h"

4. #import ?"xxx.h"

用戶自定義的文件雙引號(hào)引用,引用時(shí)編譯器首先會(huì)在用戶目錄下查找企孩,然后去安裝目錄中查找锭碳,最后在系統(tǒng)文件目錄中查找。

區(qū)別:

#import和#include同樣可以將頭文件引入到我們需要的文件中勿璃,那么它們有什么區(qū)別呢?

當(dāng)我們?cè)诖a中對(duì)同一個(gè)文件進(jìn)行兩次#include的時(shí)候會(huì)報(bào)錯(cuò):因?yàn)?include相當(dāng)于拷貝頭文件中的內(nèi)容擒抛,所以會(huì)報(bào)重復(fù)定義的錯(cuò)誤。

例如: 有a.h补疑、b.h歧沪、c.h三個(gè)頭文件, ?b.h引用包含a.h, ? c.h中同時(shí)引用包含a.h和b.h:

如果使用#include來(lái)包含頭文件,不做重復(fù)引用處理情況下莲组,那么在c.h中相當(dāng)于包含了兩次a.h诊胞。這樣在編譯時(shí)就會(huì)引起不必要的錯(cuò)誤,這時(shí)就需要引入頭文件保護(hù)符才能避免c.h中重復(fù)引用包含兩次a.h锹杈。

頭文件保護(hù)參考C++頭文件保護(hù)撵孤,C語(yǔ)言預(yù)處理命令詳解

1#ifndef ?<標(biāo)識(shí)符>

2 ? ? ? ? ? ?#define ?<標(biāo)識(shí)符>

3 ? ? ? ? ? ?//真正的內(nèi)容,如函數(shù)聲明之類

4 #endif

如果使用#import來(lái)包含頭文件竭望,那么不需要做任何事情邪码,在c.h中就只會(huì)包含一次a.h,而不會(huì)引起任何錯(cuò)誤咬清。不管你對(duì)一個(gè)文件同時(shí)包含了多少次闭专,使用#import確定只會(huì)包含一次奴潘。所以它可以解決重復(fù)導(dǎo)入的問(wèn)題,它會(huì)做一次判斷影钉,如果已經(jīng)導(dǎo)入一次就不導(dǎo)入了画髓。 ? ? ? ? ? ? ? ? ?

實(shí)際上#import與#include功能基本相同,不過(guò)它避免了重復(fù)引用的問(wèn)題斧拍,我們?cè)谝梦募臅r(shí)候不用再去自己進(jìn)行重復(fù)引用處理雀扶。所以在OC中我們基本用的都是import。

注意:

在使用#include的時(shí)候要注意處理重復(fù)引用的問(wèn)題(這也是OC中#include與#import的區(qū)別



二肆汹、#import與@class區(qū)別


1.#import會(huì)將此類的所有文件全部導(dǎo)入,包括實(shí)例變量和方法予权。

@class只是告訴編譯器有這么一個(gè)類昂勉,引用類名,至于這些類是如何定義實(shí)現(xiàn)的不去考慮扫腺,一般用在.h文件的@interface之前岗照。

2.在頭文件中,@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候笆环,此時(shí)只需要@class類名即可攒至,不需要知道其內(nèi)部的實(shí)體變量和方法。

而在.m文件里面躁劣,如果會(huì)用到這個(gè)引用類的內(nèi)部的實(shí)例變量和方法迫吐,需要使用#import來(lái)包含這個(gè)被引用類的頭文件,這時(shí)候才包含了這個(gè)被引用的類的所有信息账忘。

3.為什么不直接在頭文件中直接#import呢?

如果有一個(gè)頭文件a.h志膀,在其他大量頭文件中都需要引用頭文件a.h,如果使用的是#import鳖擒,那么當(dāng)a.h中有了一點(diǎn)改動(dòng)時(shí)溉浙,其他包含a.h的頭文件都需要重新編譯,這將耗費(fèi)大量的時(shí)間蒋荚,降低了開(kāi)發(fā)效率戳稽。

而如果在需要的時(shí)候使用的是@class,當(dāng)a.h中有了一點(diǎn)改動(dòng)時(shí)期升,由于其他頭文件并沒(méi)有將a.h的內(nèi)容包含進(jìn)來(lái)惊奇,就不用重新編譯,提高了開(kāi)發(fā)效率吓妆。

還有一個(gè)用法會(huì)引起編譯錯(cuò)誤的就是在a.h中#import ‘’b.h‘’ 在b.h中#import ‘’a.h‘’那么在編譯的時(shí)候也會(huì)出現(xiàn)錯(cuò)誤赊时。

4.什么時(shí)候該用@class,什么時(shí)候需要用#import呢行拢?

(1)一般如果有繼承關(guān)系的用#import祖秒,如B是A的子類那么在B中聲明A?xí)r用#import。

(2)如果有循環(huán)依賴關(guān)系,如:A–>B, B–>A這樣的相互依賴關(guān)系竭缝,如果使用#import來(lái)相互包含房维,那么就會(huì)出現(xiàn)編譯錯(cuò)誤,如果使用@class在兩個(gè)類的頭文件中相互聲明抬纸,則不會(huì)有編譯錯(cuò)誤出現(xiàn). @class指令只是告訴編譯器咙俩,這是個(gè)類,保留個(gè)空間來(lái)存放指針就可以了湿故。

(3)還有就是自定義代理的時(shí)候阿趁,如果在頭文件中想聲明遵循代理,遵循協(xié)議的時(shí)候應(yīng)該用#import導(dǎo)入文件坛猪,不然的話會(huì)出錯(cuò)誤脖阵。(delegate還不太清楚,正在學(xué)習(xí)和實(shí)踐)

(4)使用有Category的類墅茉,要在.h頭文件里用#import把Category包含進(jìn)來(lái)命黔。


總結(jié):

1.能使用#import的地方就不要使用#inlclude

2.使用#import不管你對(duì)一個(gè)文件同時(shí)包含了多少次,最終只會(huì)包含一次

3.在頭文件中如果沒(méi)有用到包含類的實(shí)現(xiàn)方法就斤,只需要知道它是一個(gè)類時(shí)悍募,就應(yīng)該使用@class,而不是#import洋机。如果需要使用類的一些方法時(shí)坠宴,則需要使用#import

4.能使用@class的地方就不要使用#import


本文章僅供學(xué)習(xí)參考槐秧,如有錯(cuò)誤之處歡迎指出和交流啄踊,謝謝!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刁标,一起剝皮案震驚了整個(gè)濱河市颠通,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膀懈,老刑警劉巖顿锰,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異启搂,居然都是意外死亡硼控,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門胳赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牢撼,“玉大人,你說(shuō)我怎么就攤上這事疑苫⊙妫” “怎么了纷责?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撼短。 經(jīng)常有香客問(wèn)我再膳,道長(zhǎng),這世上最難降的妖魔是什么曲横? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任喂柒,我火速辦了婚禮,結(jié)果婚禮上禾嫉,老公的妹妹穿的比我還像新娘灾杰。我一直安慰自己,他們只是感情好熙参,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布吭露。 她就那樣靜靜地躺著,像睡著了一般尊惰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泥兰,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天弄屡,我揣著相機(jī)與錄音,去河邊找鬼鞋诗。 笑死膀捷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的削彬。 我是一名探鬼主播全庸,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼融痛!你這毒婦竟也來(lái)了壶笼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雁刷,失蹤者是張志新(化名)和其女友劉穎覆劈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沛励,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡责语,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了目派。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坤候。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖企蹭,靈堂內(nèi)的尸體忽然破棺而出白筹,到底是詐尸還是另有隱情智末,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布遍蟋,位于F島的核電站吹害,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虚青。R本人自食惡果不足惜它呀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒厘。 院中可真熱鬧纵穿,春花似錦、人聲如沸奢人。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)何乎。三九已至句惯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間支救,已是汗流浹背抢野。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留各墨,地道東北人指孤。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贬堵,于是被迫代替她去往敵國(guó)和親恃轩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理黎做,服務(wù)發(fā)現(xiàn)叉跛,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • #import與#include的區(qū)別 #import比起#include的好處就是不會(huì)引起交叉編譯 for ex...
    myjourney閱讀 337評(píng)論 0 0
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問(wèn)題 3.指南認(rèn)識(shí) 4.解決思路 ios開(kāi)發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    陽(yáng)光的大男孩兒閱讀 4,969評(píng)論 0 13
  • 2017.03.14 新增一段c++代碼引几,編譯報(bào)crosses initialization of xxx的錯(cuò)誤昧互。...
    摹喵居士閱讀 1,488評(píng)論 0 0
  • 5a0f6578aa38閱讀 693評(píng)論 0 0