《Objective-C基礎(chǔ)教程》讀書筆記4—OC擴(kuò)展

源文件組織
1.1 拆分接口和實(shí)現(xiàn)
主要討論把程序代碼拆分到不同文件中的方法。
Objective-C的源代碼分為兩部分唯卖。一部分是接口眠寿,用來展示類的構(gòu)造。接口包含了使用該類所需的所有信息山憨。編譯器將@interface部分編譯后查乒,你才能使用該類的對象,調(diào)用類方法郁竟,將對象復(fù)合到其他類中玛迄,以及創(chuàng)建子類。源代碼的另一個(gè)組成部分是實(shí)現(xiàn)棚亩。@implementation部分告訴Objective-C編譯器如何讓該類工作蓖议。這部分代碼實(shí)現(xiàn)了接口所聲明的方法。
在類的定義中讥蟆,代碼很自然地被拆分為接口和實(shí)現(xiàn)兩個(gè)部分勒虾,所以類的代碼通常分別放在兩個(gè)文件里。一個(gè)文件存放接口部分的代碼:類的@interface指令瘸彤、公共struct定義修然、enum常量、#defines和extern全局變量等钧栖。由于Objective-C繼承了C的特點(diǎn)低零,所以上述代碼通常放在頭文件中。頭文件名稱與類名相同拯杠,只是用.h做后綴掏婶。所有的實(shí)現(xiàn)內(nèi)容(如類的@implementation指令、全局變量的定義潭陪、私有struct等)都被放在了與類同名但以.m為后綴的文件中(有時(shí)叫做.m文件)雄妥。類的使用者可以通過#import命令導(dǎo)入頭文件來獲得該類的功能。
如果用.mm做文件擴(kuò)展名依溯,編譯器就會認(rèn)為你是用Objective-C++編寫的代碼老厌,這樣你就可以同時(shí)使用C++和Objective-C來編程了。
目標(biāo)(Target), 復(fù)雜的項(xiàng)目可以擁有多個(gè)目標(biāo)黎炉,它們源文件的配置各不相同枝秤,構(gòu)建規(guī)則也不同。
Xcode中有一個(gè)與項(xiàng)目同名的群組慷嗜,文件都放在群組內(nèi)的文件夾中淀弹。(你可以在項(xiàng)目導(dǎo)航器中瀏覽項(xiàng)目文件的構(gòu)造丹壕。) 這些文件夾(在Xcode中稱作群組)能夠幫你組織項(xiàng)目中的源文件。你可以創(chuàng)建存放用戶界面類的群組薇溃,也可以創(chuàng)建存放數(shù)據(jù)處理類的群組菌赖,這樣項(xiàng)目更易于瀏覽。在設(shè)置群組時(shí)沐序,Xcode并不會在硬盤上移動文件或者創(chuàng)建目錄琉用。群組關(guān)系僅僅是由Xcode負(fù)責(zé)管理的一項(xiàng)奇妙的功能〔哂祝可以設(shè)置Xcode中的群組指向文件系統(tǒng)中某個(gè)特定的目錄邑时,Xcode會幫你將新建的文件放入該目錄中。
1.2 拆分程序
在.m文件中一般引入.h文件的頭文件垄惧,原因是:編譯器需要知道類里的實(shí)例變量配置刁愿,這樣才能生成合適的代碼,但是它并不知道與源文件配套的頭文件也存在到逊。所以铣口,需要在.m文件中引入.h文件的頭文件,將此信息告知編譯器觉壶。在程序編譯時(shí)脑题,如果你碰到了“Can not find interface declaration for Tire”(無法找到Tire類的接口定義)之類的錯(cuò)誤信息,通常是因?yàn)槟阃浻?import導(dǎo)入類的頭文件了铜靶。
注意:導(dǎo)入頭文件有兩種方法:使用引號或者尖括號叔遂。帶尖括號的語句用于導(dǎo)入系統(tǒng)頭文件,而帶引號的語句則說明導(dǎo)入的是項(xiàng)目本地的頭文件争剿。
1.3 使用跨文件依賴關(guān)系
依賴關(guān)系(dependency)是兩個(gè)實(shí)體之間的一種關(guān)系已艰。在編程和開發(fā)中,經(jīng)常會出現(xiàn)關(guān)于依賴關(guān)系的問題蚕苇。依賴關(guān)系可以存在于兩個(gè)類之間哩掺。依賴關(guān)系也可以存在于兩個(gè)或多個(gè)文件之間。導(dǎo)入頭文件使頭文件和源文件之間建立了一種緊密的依賴關(guān)系涩笤。如果頭文件有任何變化嚼吞,那么所有依賴它的文件都得重新編譯。這會在需要編譯的文件中引發(fā)一連串的變化蹬碧。盡管重新編譯需要花費(fèi)很長的時(shí)間舱禽,但至少Xcode幫你記錄了所有的依賴關(guān)系。
1.3.1 重新編譯須知
導(dǎo)致依賴關(guān)系問題的原因是Objective-C編譯器需要某些信息才能夠工作恩沽。有時(shí)候編譯器需要知道類的全部信息誊稚,而有的時(shí)候,編譯器只需要知道類名即可,不需要了解整個(gè)定義里伯。
復(fù)合通過指針指向?qū)ο笳阑瑁@之所以能行得通,是因?yàn)樗蠴bjective-C對象都使用動態(tài)分配的內(nèi)存俏脊。
Objective-C引入了關(guān)鍵字@class來告訴編譯器:“這是一個(gè)類,所以我只會通過指針來引用它肤晓∫叮” 這樣編譯器就放心了:它不必知道關(guān)于這個(gè)類的更多信息,只要了解它是通過指針來引用的即可补憾。@class創(chuàng)建了一個(gè)前向引用漫萄。如果有循環(huán)關(guān)系,@class也很有用盈匾。即A類使用B類腾务, B類也使用A類。如果試圖通過#import語句讓兩個(gè)類相互引用削饵,那么就會出現(xiàn)編譯錯(cuò)誤岩瘦。但是如果在A.h文件中使用@class B, 在B.h文件中使用@classB, 那么這兩個(gè)類就可以相互引用了。
如果A類繼承自B類窿撬,則需要在.h文件中導(dǎo)入B類的頭文件启昧,而不能用@class。(因?yàn)檫@里是繼承自其他類而不是指向其他類的)因?yàn)榫幾g器需要先知道所有關(guān)于超類的信息才能成功地為其子類編譯@interface部分劈伴。它需要了解超類中實(shí)例變量的配置信息(數(shù)據(jù)類型密末、大小和排序)。在子類添加實(shí)例變量時(shí)跛璧,它們會被附加在超類實(shí)例變量的后面严里。然后編譯器就利用這些信息計(jì)算在內(nèi)存的什么位置能找到這些實(shí)例變量,每個(gè)方法都通過自身的self隱藏指針進(jìn)行尋找追城。為了能夠精確地計(jì)算出實(shí)例變量的位置刹碾,編譯器必須先了解該類的所有內(nèi)容。
注意漓柑,文件導(dǎo)入過于混亂會延長編譯時(shí)間教硫,也會導(dǎo)致不必要的重復(fù)編譯。而巧妙使用@class指令辆布,可以減少必須導(dǎo)入的頭文件的數(shù)量瞬矩,從而可以縮短編譯時(shí)間。
“pragma”源自希臘語锋玲,意思是“行動”景用。#pragma指令將Objective-C常規(guī)代碼之外的信息或說明傳遞給編譯器和代碼編輯器。通常,pragma是被忽略的伞插,但它在一些軟件開發(fā)工具中可能有其他的含義割粮。如果某個(gè)工具并不知道pragma是什么,并不會生成警告或錯(cuò)誤信息媚污,而是很聰明地忽略它舀瓢。
Xcode中有兩種調(diào)試器可供選擇:GDB和LLDB。GDB是GNU計(jì)劃的一部分耗美,可以在各種平臺上兼容京髓。LLDB是LLVM計(jì)劃多個(gè)Xcode工具中的一員。目前兩者之間的不同主要是精細(xì)度和內(nèi)聯(lián)性商架。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堰怨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛇摸,更是在濱河造成了極大的恐慌备图,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶袄,死亡現(xiàn)場離奇詭異揽涮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饿肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門绞吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唬格,你說我怎么就攤上這事家破。” “怎么了购岗?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵汰聋,是天一觀的道長。 經(jīng)常有香客問我喊积,道長烹困,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任乾吻,我火速辦了婚禮髓梅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绎签。我一直安慰自己枯饿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布诡必。 她就那樣靜靜地躺著奢方,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟋字,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天稿蹲,我揣著相機(jī)與錄音,去河邊找鬼鹊奖。 笑死苛聘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忠聚。 我是一名探鬼主播焰盗,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咒林!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爷光,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤垫竞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蛀序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢瞪,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年徐裸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遣鼓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重贺,死狀恐怖骑祟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气笙,我是刑警寧澤次企,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站潜圃,受9級特大地震影響缸棵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谭期,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一堵第、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隧出,春花似錦踏志、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春涵紊,著一層夾襖步出監(jiān)牢的瞬間傍妒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工摸柄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤练,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓驱负,卻偏偏與公主長得像嗦玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子跃脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

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