Effective Objective-C 2.0讀書筆記(一)

熟悉Objective-C#

第一條:Objective-C的起源

OC使用"消息結(jié)構(gòu)"而非"函數(shù)調(diào)用",Objective-C語言由Smalltalk演化而來,消息與函數(shù)調(diào)用之間的區(qū)別看上去就像這樣:

//消息結(jié)構(gòu)(Objective-C)
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter1];

//函數(shù)調(diào)用(C++)
Object *obj = new Object;
obj->perform(parameter1,parameter2);

關(guān)鍵區(qū)別在于:使用消息結(jié)構(gòu)的語言,其運行時所應(yīng)執(zhí)行的代碼由運行環(huán)境來決定辞槐;而使用函數(shù)調(diào)用的語言,則由編譯器決定榄檬。

要點

  • Objective-C為C語言的添加了面向?qū)ο筇匦裕瞧涑壉拧bjective—C使用動態(tài)綁定的消息結(jié)構(gòu),也就是說犬缨,在運行時才會檢查對象類型。接收一條消息之后刺彩,究竟應(yīng)執(zhí)行何種代碼,由運行環(huán)境而非編譯器來決定创倔。
  • 理解C語言的核心概念有助于寫好Objective-C程序。尤其要掌握內(nèi)存模型和指針畦攘。

第二條:在類的頭文件中盡量少引入其他頭文件

你可能創(chuàng)建了名為EOCPerson和EOCEMPloyer這兩個類,想讓每個EOCPerson實例都有一個EOCEMPloyer常見的辦法是在EOCPerson.h中加入下面這行:

#import "EOCEMPloyer.h"

這種辦法可行,但是不夠優(yōu)雅知押。在編譯一個使用了EOCPerson類的文件時鹃骂,不需要知道EOCEmplyer類的全部細節(jié)台盯,只需要知道有一個類名為EOCEmplyer就好畏线。所幸有個辦法能把這一情況告訴編譯器:

@class EOCEmployer;

這叫做"向前聲明"該類。而EOCPerson類的實現(xiàn)文件則需引入EOCEployer類的頭文件寝殴,因為若要使用后者明垢,則必須知道其所有接口細節(jié)。
將引入頭文件的時機盡量延后袖外,只有確有需要時才引入魂务,這樣就可以減少類的使用者所需引入的頭文件數(shù)量曼验。假設(shè)本例把EOCEmployer.h引入到EOCPerson.h,那么只要引入EOCPerson.h粘姜,就會一并引入EOCEployer.h的所有內(nèi)容。此過程若持續(xù)下去孤紧,則要引入許多根本用不到的內(nèi)容,這當然會增加編輯時間号显。向前聲明也解決了兩個類互相引用的問題。

如果要聲明你寫的類遵從某個協(xié)議(protocol),那么該協(xié)議必須有完整定義押蚤,且不能使用向前聲明。向前聲明只能告訴編譯器有某個協(xié)議揽碘,而此時編譯器卻要知道該協(xié)議中定義的方法。此時在.h中#import是難免的雳刺。鑒于此,最好把協(xié)議單獨放在一個頭文件中掖桦。要是把協(xié)議放在某個大的頭文件中,那么只要引入此協(xié)議枪汪,就必定會引入那個頭文件中的全部內(nèi)容,就會產(chǎn)生相互依賴的問題,而且還會增加編譯時間朱监。

然而有些協(xié)議,比如代理協(xié)議赫编,就不用單獨寫一個頭文件了奋隶。在這種情況下協(xié)議只有與接受協(xié)議委托的類放在一起定義才有意義。

要點

  • 除非確有需要唯欣,否則不要引入頭文件。一般來說境氢,應(yīng)該在某個類的頭文件中使用向前聲明來提及別的類碰纬,并在實現(xiàn)文件中引入那些類的頭文件萍聊。這樣做可以盡量降低類之間的耦合悦析。
  • 有時無法使用向前聲明,比如聲明某個類遵循某項協(xié)議强戴。應(yīng)盡量把“該類遵循某協(xié)議"的這條聲明移至"class-continuation 分類"中。如果不行的話骑歹,就把協(xié)議放到一個頭文件中,然后將其引入陵刹。

第三條:多用字面量語法,少用與之等價的方法

使用字面量語法可以縮減代碼長度衰琐,使其更為易讀。例如:

NSNumber *intNumber = @1;
NSArray *animals = @[@"cat",@"dog",@"mouse",@"badger"];
NSDictionary *personData = @{@"firstName":@"Matt",@"lastName":@"Galloway"};

數(shù)組取某個下標所對應(yīng)的對象狸剃,例如:

NSString *dog = animals[1];

字典按照特定鍵訪問其值,例如:

NSString *lastName = personData[@"lastName"];

修改可變數(shù)組與字典內(nèi)容的標準做法是:

mutableArray[1] = @"dog";
mutableDictionary[@"lastName"] = @"Galloway";

不過钞馁,用字面量語法創(chuàng)建數(shù)組時要注意,若數(shù)組元素對象中有nil僧凰,則會拋出異常熟丸,拋出的異常會是這樣:

***Terminating app due to uncaught exception
'NSInvalidArgumentException,'reason:'***
- [__NSPlaceholderArray initWithObjects:count:]: attempt to
insert nil object from objects[0]'

用數(shù)組一樣训措,用字面量語法創(chuàng)建字典時也有這個問題,那就是一旦有值為nil绩鸣,便會拋出異常。但這也是個好事呀闻。例如創(chuàng)建字典時不小心用了空值對象,那么“dictionaryWithObjectAndKeys:”方法就會在首個nil之前停下蓖康,并拋出異常,這樣有助于差錯钓瞭。

要點

  • 應(yīng)該使用字面量語法來創(chuàng)建字符串,數(shù)值山涡,數(shù)組,字典鸭丛。與常規(guī)方法相比,這樣做更加簡明扼要鳞溉。
  • 應(yīng)該通過去下標操作來訪問數(shù)組下標或字典中的鍵所對應(yīng)的元素鼠哥。
  • 用字面量語法創(chuàng)建數(shù)組或字典時熟菲,若值中有nil朴恳,則會拋出異常。因此于颖,務(wù)必確保值里不含nil。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末做入,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竟块,更是在濱河造成了極大的恐慌,老刑警劉巖浪秘,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秫逝,居然都是意外死亡询枚,警方通過查閱死者的電腦和手機违帆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門刷后,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尝胆,你說我怎么就攤上這事『危” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵贪染,是天一觀的道長催享。 經(jīng)常有香客問我杭隙,道長因妙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任铣耘,我火速辦了婚禮,結(jié)果婚禮上涡拘,老公的妹妹穿的比我還像新娘。我一直安慰自己鳄乏,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布橱野。 她就那樣靜靜地躺著善玫,像睡著了一般密强。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或渤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天奕扣,我揣著相機與錄音薪鹦,去河邊找鬼惯豆。 笑死,一個胖子當著我的面吹牛楷兽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芯杀,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跛梗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起核偿,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顽染,失蹤者是張志新(化名)和其女友劉穎漾岳,沒想到半個月后粉寞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡唧垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年振亮,在試婚紗的時候發(fā)現(xiàn)自己被綠了巧还。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊秸。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阶牍,靈堂內(nèi)的尸體忽然破棺而出走孽,到底是詐尸還是另有隱情咬像,我是刑警寧澤肮柜,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響南吮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涂邀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一浩聋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闸与,春花似錦厂画、人聲如沸袱院。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锈锤,卻和暖如春牙咏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁寄。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工删咱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摘能,地道東北人严望。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓复隆,卻偏偏與公主長得像挽拂,于是被迫代替她去往敵國和親样刷。 傳聞我的和親對象是個殘疾皇子箕母,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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