2: 在類的頭文件中盡量少引用其他頭文件

與C、C++一樣话原,Objective-C也使用“頭文件”和“實現(xiàn)文件”來區(qū)隔代碼夕吻。用Objective-C語言編寫類的標(biāo)準(zhǔn)方式:以類名做文件名,分別創(chuàng)建2個文件,頭文件后綴.h,實現(xiàn)文件.m
用Objective-C語言編寫任何類幾乎都需要引入Foundation.h,如果不在該類本身引入這個文件的話,那么就要引入與其超類所屬框架相對應(yīng)的"基本頭文件"


使用向前聲明延后引入頭文件時機(jī)

比如存在CWGPerson類和CWGEmployer類。
每個CWGPerson實例都應(yīng)該有一個CWGEmployer.
于是我們一般會這樣寫:(直接在.h中引入頭文件)

#import "CWGEmployer.h" 
@interfance  CWGPerson : NSObject 
@property (nonatomic, strong) CWGEmployer *employer; 
@end 

這樣做不是不行,只是不夠優(yōu)雅罷了.因為在編譯一個使用了CWGPerson類的文件時,不需要知道CWGEmployer類的全部細(xì)節(jié),只需要知道有一個類名CWGEmployer就可以了.于是我們還可以這樣寫:

//類CWGPerson頭文件
@class CWGEmployer
@interfance  CWGPerson : NSObject
@property (nonatomic, strong) CWGEmployer *employer;
@end

CWGPerson.m實現(xiàn)文件中則需要引入CWGEmployer類的頭文件,因為使用的時候,則必須知道其所有的細(xì)節(jié).

//類CWGPerson實現(xiàn)文件
#import "CWGPerson.h"
#import "CWGEmployer.h"
@implementation CWGPerson
// Implementation of methods
@end
  • 向前聲明減少引入頭文件的數(shù)量繁仁,減少了編譯時間

將引入頭文件的時機(jī)盡量延后, 只在確有需要時才真正引入,這樣可以減少類的使用者所需引入頭文件的數(shù)量.假如把CWGEmployer.h引入到CWGPerson.h中,那么只要引入CWGPerson.h,就會引入CWGEmployer.h的全部內(nèi)容.如此持續(xù)下去,則要引入很多根本用不到的內(nèi)容,還增加了編譯時間.

  • 向前聲明還避免了兩個類相互引用的問題.

例如CWGEmployer.m中增加了方法:

  • (void)addEmployee:(CWGPerson *)person;

如果CWGPerson和CWGEmployer涉馅,都將彼此頭文件引入到自己頭文件中,這時候編譯CWGEmployer,編譯器必須知道CWGPerson這個類,而要編譯CWGPerson,又必須知道CWGEmployer.這時候就會導(dǎo)致"循環(huán)引用".雖然使用#import不會導(dǎo)致死循環(huán)(#include會),但是這意味著2個類有一個是無法編譯成功的黄虱。
分析:當(dāng)類A引用類B稚矿,類B又需要引用類A的時候,如果我們都在.h頭文件中引用對方的頭文件捻浦,那么就會出現(xiàn)頭文件循環(huán)引用的問題晤揣,實際上使用#import而非#include指令雖然不會導(dǎo)致死循環(huán),但卻意味著兩個類中有一個無法被正確編譯而報錯朱灿。

相互引入頭文件導(dǎo)致編譯報錯

解決方案:(目的是實現(xiàn)兩個文件編譯時刻不在相互引用對方)
1.在其中一個類.h頭文件使用@class關(guān)鍵字向前聲明另一個類昧识,在該類.m文件中再使用#import引入頭文件,另一個類正常引用就行盗扒。
2.在兩個類的.h頭文件中均使用@class跪楞,在兩個類的.m實現(xiàn)文件中再使用#import引入對應(yīng)的頭文件。

一些必須引入頭文件的情況
有些時候必須引入頭文件:
1.該類繼承了某個超類环疼,則必須引入定義那個超類的頭文件习霹。
2.該類遵循某協(xié)議,也要引入該協(xié)議對應(yīng)的頭文件

如果你寫的類繼承某個超類,則必須引入定義那個超類的頭文件.
如果要聲明你寫的那個類遵從某個協(xié)議(protocol),那么該協(xié)議必須有完整的定義.且不能使用"向前聲明".因為"向前聲明"只能告訴編譯器有這么個協(xié)議,但是編譯器這時要知道這個協(xié)議中定義的方法.例如:

#import "CWGShape.h"
#import "CWGDrawable.h"
@interface CWGRectangle : CWGShape  <CWGDrawable>
@property (nonatomic, assign) CGFloat width;  ///< 寬
@property (nonatomic, assign) CGFloat height; ///< 高
@end

其中#import "CWGDrawable.h"是難免的.

#####總結(jié):

* 除非確有必要,否則不要引入頭文件.一般說來,應(yīng)該在某個類的頭文件中使用"向前聲明"來提及別的類.并在實現(xiàn)文件中引入那些類的頭文件,這樣做可以盡量降低類之間的耦合性.

* 有時無法使用"向前聲明",比如某個類要遵從某個協(xié)議,這種情況下,盡量把"該類遵循某協(xié)議"的聲明移至到"延展"中(class - continuation 分類).如果還不行,就把協(xié)議單獨放在一個頭文件中,然后將其引入.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炫隶,一起剝皮案震驚了整個濱河市淋叶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伪阶,老刑警劉巖煞檩,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栅贴,居然都是意外死亡斟湃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門檐薯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凝赛,“玉大人注暗,你說我怎么就攤上這事∧沽裕” “怎么了捆昏?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毙沾。 經(jīng)常有香客問我骗卜,道長,這世上最難降的妖魔是什么左胞? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任寇仓,我火速辦了婚禮,結(jié)果婚禮上烤宙,老公的妹妹穿的比我還像新娘遍烦。我一直安慰自己,他們只是感情好躺枕,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布乳愉。 她就那樣靜靜地躺著,像睡著了一般屯远。 火紅的嫁衣襯著肌膚如雪蔓姚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天慨丐,我揣著相機(jī)與錄音坡脐,去河邊找鬼。 笑死房揭,一個胖子當(dāng)著我的面吹牛备闲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捅暴,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼恬砂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓬痒?” 一聲冷哼從身側(cè)響起泻骤,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梧奢,沒想到半個月后狱掂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體食呻,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旅急,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酷宵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惦蚊。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡器虾,死狀恐怖讯嫂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兆沙,我是刑警寧澤端姚,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站挤悉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巫湘。R本人自食惡果不足惜装悲,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尚氛。 院中可真熱鬧诀诊,春花似錦、人聲如沸阅嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯柔。三九已至抡蛙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魂迄,已是汗流浹背粗截。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留捣炬,地道東北人熊昌。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像湿酸,于是被迫代替她去往敵國和親婿屹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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