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

? ? ? 最近打算把Effective Objective-C 2.0重新再精讀一遍冈涧,所以在此留下筆記殊者,一方面是監(jiān)督自己能堅(jiān)持下去太雨,不能像第一遍那樣走馬觀花名段,讀過(guò)就忘得差不多了阱扬;另一方面是想把一些好的東西分享給大家。

1.了解Objective-C語(yǔ)言的起源

? ? ? Objective-C語(yǔ)言由smalltalk演化而來(lái)伸辟,該語(yǔ)言使用消息結(jié)構(gòu)而非函數(shù)調(diào)用麻惶。關(guān)鍵區(qū)別在于:使用消息結(jié)構(gòu)的語(yǔ)言,其運(yùn)行時(shí)所執(zhí)行的代碼由運(yùn)行環(huán)境決定信夫,而使用函數(shù)調(diào)用的語(yǔ)言窃蹋,則由編譯器決定卡啰。

? ? ? ? Objective-C的重要工作都由“運(yùn)行期組件”來(lái)完成,因此警没,只需要更新運(yùn)行期組件匈辱,即可提升應(yīng)用程序性能。Objective-C是C的“超集”杀迹,所以C語(yǔ)言中的所有功能在此依然適用亡脸,因此,必須同時(shí)掌握這兩門語(yǔ)言的核心概念树酪,方能寫出高效的代碼來(lái)浅碾。Objective-C中的指針是用來(lái)指示對(duì)象的锄俄,想要聲明一個(gè)變量晤硕,令其指代某個(gè)對(duì)象林艘,可用如下語(yǔ)法:

? ? ? ? ? ? ? ? ? NSString *someString = @"The string.";

這種語(yǔ)法基本上是照搬C魚呀的阴颖,它聲明了一個(gè)名為someString的變量,其類型是NSString *瞬捕。也就是說(shuō)此變量為指向NSString的指針虱疏。所有Objective-C語(yǔ)言的對(duì)象都必須這樣聲明毒涧,因?yàn)閷?duì)象所占內(nèi)存總是分配在“堆空間”中力试,而不會(huì)分配在“椺懔冢”上。

2.在類的頭文件中盡量少引入其他頭文件

? ? ? ? 將引入頭文件的時(shí)機(jī)盡量延后畸裳,只在確有需要時(shí)才引入鹃栽,這樣就可以減少類的使用者所需要引入的頭文件數(shù)量,避免引入許多根本用不到的內(nèi)容躯畴,增加編譯時(shí)間。一般來(lái)說(shuō)薇芝,應(yīng)在某個(gè)類的頭文件中使用向前聲明"@class 類名" 來(lái)提及別的類蓬抄,并在實(shí)現(xiàn)文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合夯到。

3.多用字面量語(yǔ)法嚷缭,少用與之等價(jià)的方法

? ? ? ? 在編寫程序時(shí),總會(huì)用到某幾個(gè)類:NSString,NSNumber,NSArray,NSDictionary,它們屬于Foundation框架耍贾。在創(chuàng)建這幾種類型時(shí)阅爽,我們可以選擇使用字面量語(yǔ)法,如:

NSString *someString = @"This is someString.";

NSNumber *someNumber = @1;

NSArray * animals = @[@"cat",@"dog",@"mouse"];

NSDictionary *personData = @{@"firstName":@"Matt",@"lastName":@"Galloway",@"age":@20};

? ? ? ? 另外荐开,我們也可以使用類本身提供的方法來(lái)創(chuàng)建實(shí)例付翁。但是使用字面量語(yǔ)法可以縮短源代碼長(zhǎng)度,使其更為易讀晃听,除此之外百侧,在使用字面量語(yǔ)法創(chuàng)建數(shù)組時(shí)砰识,若數(shù)組元素對(duì)象中有nil,則會(huì)拋出異常,因?yàn)樽置媪空Z(yǔ)法實(shí)際上只是一種“語(yǔ)法糖”佣渴,其效果等于先創(chuàng)建了一個(gè)數(shù)組辫狼,然后把方括號(hào)內(nèi)的所有對(duì)象都加到這個(gè)數(shù)組中。下面這段代碼分別以兩種語(yǔ)法創(chuàng)建數(shù)組:

id object1 = /*..*/;

id object2 = /*..*/;

id object3 = /*..*/;

NSArray *arrayA = [NSArray arrayWithObjects:object1,object2,object3,nil];

NSArray *arrayB = @[object1,object2,object3];

如果object2是nil辛润,其他兩個(gè)對(duì)象都是有效的OC對(duì)象膨处。那會(huì)出現(xiàn)什么情況呢?按字面量語(yǔ)法創(chuàng)建數(shù)組的arrayB會(huì)拋出異常,拋出的異常會(huì)是這樣:

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

arrayA雖然能創(chuàng)建出來(lái)真椿,但是其中卻只含有一個(gè)對(duì)象。原因在于晦溪,“arrayWithObjects:”方法會(huì)依次處理各個(gè)參數(shù)瀑粥,直到發(fā)現(xiàn)nil為止,由于object2是nil三圆,所以該方法會(huì)提前結(jié)束狞换。

? ? ? ? 這個(gè)微妙的差別表明,使用字面量語(yǔ)法更為安全舟肉。拋出異常令程序終止執(zhí)行修噪,這比創(chuàng)建好數(shù)組后才發(fā)現(xiàn)元素少了要好。

? ? ? ? 與數(shù)組一樣路媚,用字面量語(yǔ)法創(chuàng)建字典時(shí)也有這個(gè)問(wèn)題黄琼,那就是一旦有值為nil,便會(huì)拋出異常整慎。不過(guò)基于同樣的原因脏款,這也是好事。假如創(chuàng)建字典時(shí)不小心用了空值對(duì)象裤园,那么"dictionaryWithObjectsAndKeys:"方法就會(huì)在首個(gè)nil之前停下撤师,并拋出異常,這有助于查錯(cuò)拧揽。

4.多用類型常量剃盾,少用#define預(yù)處理指令

編寫代碼時(shí)經(jīng)常要定義常量。例如淤袜,定義一個(gè)播放動(dòng)畫時(shí)間:

#define ANIMATIONDUARTION 0.3

? ? ? ? 上述預(yù)處理指令會(huì)把源代碼中的ANIMATIONDUARTION字符串替換為0.3,這可能就是你想要的效果痒谴,不過(guò)這樣定義出來(lái)的常量沒(méi)有類型信息,而且即使有人重新定義了常量值铡羡,編譯器也不會(huì)產(chǎn)生警告信息积蔚,這將導(dǎo)致應(yīng)用程序中的常量值不一致。若是此指令聲明在某頭文件中烦周,那引入該頭文件的代碼库倘,ANIMATIONDUARTION都將被替換临扮。有個(gè)辦法,就比用預(yù)處理指令來(lái)定義常量更好:

static const NSTimeInterval kAnimationDuration = 0.3;

請(qǐng)注意教翩,用此方式定義的常量包含類型信息杆勇,其好處是清楚地描述了常量的定義。由此可知該常量類型饱亿,這有助于為其編寫開(kāi)發(fā)文檔蚜退。如果要定義許多常量,那么這種方式能令稍后閱讀代碼的人更易理解其意圖彪笼。常量的命名法是:若常量局限于某“編譯單元”钻注,也就是實(shí)現(xiàn)文件之內(nèi),則在前面加字母k配猫,若常量在類之外可見(jiàn)幅恋,則通常以類名為前綴。

? ? ? ?變量一旦同時(shí)用static與const來(lái)聲明泵肄,如果試圖修改由const修飾符所聲明的變量捆交,那么編譯器就會(huì)報(bào)錯(cuò)。而static修飾符則意味著該變量?jī)H在定義此變量的編譯單元中可見(jiàn)腐巢。假如此變量前不加static品追,則編譯器會(huì)為它創(chuàng)建一個(gè)“外部符號(hào)”。此時(shí)若是另一個(gè)編譯單元中也聲明了同名變量冯丙,那么編譯器就會(huì)拋出一條錯(cuò)誤信息肉瓦。如果需要對(duì)外公開(kāi)某個(gè)常量,則可用以下方式胃惜,在.h文件中聲明:extern NSString *const EOCStringConstant;

在.m文件中定義:NSString *const EOCStringConstant = @"VALUE";

這種常量要出現(xiàn)在全局符號(hào)表中泞莉,所以其名稱應(yīng)加以區(qū)隔,通常用與之相關(guān)的類名做前綴船殉。

5.用枚舉表示狀態(tài)戒财,選項(xiàng),狀態(tài)碼

? ? ? ?應(yīng)該用枚舉來(lái)表示狀態(tài)機(jī)的狀態(tài)捺弦,傳遞給方法的選項(xiàng)以及狀態(tài)碼等值,給這些值起個(gè)易懂的名字孝扛。

? ? ? ?如果把傳遞給某個(gè)方法的選項(xiàng)表示為枚舉類型列吼,而多個(gè)枚舉選項(xiàng)又可同時(shí)使用,那么就將各選項(xiàng)值定義為2的冪苦始,以便通過(guò)按位或操作將其組合起來(lái)寞钥。

? ? ? ? 用NS_ENUM 與 NS_OPTIONS宏來(lái)定義枚舉類型,并指明其底層數(shù)據(jù)類型陌选。這樣做可以確保枚舉是開(kāi)發(fā)者所選的底層數(shù)據(jù)類型實(shí)現(xiàn)出來(lái)的理郑,而不會(huì)采用編譯器所選的類型蹄溉。

? ? ? 在處理枚舉類型的switch語(yǔ)句中不要實(shí)現(xiàn)default分支,這樣的話您炉,加入新枚舉之后柒爵,編譯器就會(huì)提示開(kāi)發(fā)者:switch語(yǔ)句并未處理所有枚舉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赚爵,一起剝皮案震驚了整個(gè)濱河市棉胀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冀膝,老刑警劉巖唁奢,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窝剖,居然都是意外死亡麻掸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門赐纱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脊奋,“玉大人,你說(shuō)我怎么就攤上這事千所】衲В” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵淫痰,是天一觀的道長(zhǎng)最楷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)待错,這世上最難降的妖魔是什么籽孙? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮火俄,結(jié)果婚禮上犯建,老公的妹妹穿的比我還像新娘。我一直安慰自己瓜客,他們只是感情好适瓦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谱仪,像睡著了一般玻熙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疯攒,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天嗦随,我揣著相機(jī)與錄音,去河邊找鬼敬尺。 笑死枚尼,一個(gè)胖子當(dāng)著我的面吹牛贴浙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播署恍,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼崎溃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锭汛?” 一聲冷哼從身側(cè)響起笨奠,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唤殴,沒(méi)想到半個(gè)月后般婆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朵逝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔚袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配名。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啤咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渠脉,到底是詐尸還是另有隱情宇整,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布芋膘,位于F島的核電站鳞青,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏为朋。R本人自食惡果不足惜臂拓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望习寸。 院中可真熱鬧胶惰,春花似錦、人聲如沸霞溪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸯匹。三九已至坊饶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忽你,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工臂容, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留科雳,地道東北人根蟹。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像糟秘,于是被迫代替她去往敵國(guó)和親简逮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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