1.#include
#include是C中用來(lái)引用文件的關(guān)鍵字闻牡,而#import是obj-c中用來(lái)代替include的關(guān)鍵字为流。
#import可以確保同一個(gè)文件只能被導(dǎo)入一次峻凫,從而避免了使用#include容易引起的重復(fù)引用問(wèn)題图甜,即classA引用了classC,classB也引用了classC突硝,而當(dāng)classD同時(shí)引用classA螃宙,classB的時(shí)候就會(huì)報(bào)重復(fù)引用的錯(cuò)誤蛮瞄。
2.#import""與#import<>
#import""實(shí)現(xiàn)從當(dāng)前工作目錄中找要導(dǎo)入的文件,如果沒(méi)有再到系統(tǒng)類(lèi)庫(kù)中找谆扎,而#import<>是直接從系統(tǒng)類(lèi)庫(kù)中找要導(dǎo)入的文件挂捅。
3.#import與@class:
@class只是告訴編譯器,后面遇到的這個(gè)名稱(chēng)是一個(gè)類(lèi)名稱(chēng)燕酷,至于這個(gè)類(lèi)是如何實(shí)現(xiàn)的暫不用考慮籍凝。
引入@class主要是用來(lái)解決引用死鎖--如果兩個(gè)類(lèi)存在循環(huán)依賴(lài)關(guān)系,即A->B,B->A苗缩,如果用#import來(lái)相互包含饵蒂,就會(huì)出現(xiàn)編譯錯(cuò)誤:
Expected specifier-qualifier-list before ‘A’或者Expected specifier-qualifier-list before ‘B’。
一般情況下酱讶,在 .h文件中退盯,只需要知道類(lèi)的名字就可以了,所以用@class泻肯,而在 .m文件中通常需要知道類(lèi)的成員變量即方法渊迁,所以要用#import來(lái)將類(lèi)文件導(dǎo)進(jìn)來(lái)。
那為什么不在 .h文件中直接用#import來(lái)將類(lèi)文件導(dǎo)入呢灶挟,因?yàn)槿绻麑?dǎo)入大量的頭文件琉朽,編譯器就會(huì)花大量的時(shí)間來(lái)編譯。
需要在 .h文件中用#import的情況:
- 如果有繼承關(guān)系的要用#import,如稚铣,A繼承B箱叁,需要在A中將B import進(jìn)來(lái)墅垮。
- /使用有category的類(lèi),需要在 .h文件中用#import將該類(lèi)的category導(dǎo)進(jìn)來(lái)耕漱。