Effective Objective-C 2.0 學(xué)習(xí)筆記(2)

接口與 API設(shè)計(jì)

15 用前綴避免命名空間沖突

  • 選擇與你公司、應(yīng)用程序或者二者皆有關(guān)聯(lián)之名稱(chēng)作為類(lèi)名的前綴鞭盟,并在所有代碼中均使用這一前綴。Apple宣稱(chēng)保留使用所有兩字母前綴的權(quán)利,所以自己所選用的前綴最好是三字母的。不僅類(lèi)名要加, 還要注意Category, 類(lèi)實(shí)現(xiàn)文件中定義的全局變量以及純C函數(shù)(這些定義會(huì)出現(xiàn)在全局符號(hào)表, 容易引起命名沖突).
  • 若自己所開(kāi)發(fā)的程序庫(kù)中用到了第三方庫(kù)汇跨,則應(yīng)為其中的名稱(chēng)加上前綴(個(gè)人認(rèn)為, 此條待考察, 加上后會(huì)影響第三方庫(kù)的升級(jí))。

16 提供“全能初始化方法”

  • 在類(lèi)中提供一個(gè)(或多個(gè), 如 NSCoding 協(xié)議的 init?WithCoder)全能初始化方法妆距,并于文檔里指明穷遂。其它初始化方法均應(yīng)調(diào)用此方法。
  • 若全能初始化方法與超類(lèi)不同娱据,則需覆寫(xiě)超類(lèi)中對(duì)應(yīng)方法塞颁。
  • 如果超類(lèi)的初始化方法并不適用于子類(lèi),那么應(yīng)該覆寫(xiě)這個(gè)超類(lèi)方法吸耿,并在其中拋出異常(@throw NSException)祠锣。

17 實(shí)現(xiàn)description方法

  • 實(shí)現(xiàn)description方法返回一個(gè)有意義的字符串,用以描述該實(shí)例(可以自定義NSLog 中的輸出內(nèi)容, 必要的可以包括類(lèi)名等, 可以將具體信息封裝在一個(gè) Dictionary 中, 可以方便的得到格式化的輸出)咽安。
  • 若想在調(diào)試時(shí)打印出更詳盡的對(duì)象描述信息伴网,則應(yīng)該實(shí)現(xiàn)debugDescription方法。該方法可以斷點(diǎn)調(diào)試時(shí)可以, 斷點(diǎn)中斷后, 在控制臺(tái)中輸出"po varName(變量名稱(chēng))", 可

18 盡量使用不可變對(duì)象

  • 盡量創(chuàng)建不可變的對(duì)象(通過(guò)定義readonly 的屬性, 注意集合是否是可變的, 盡量通過(guò)暴露的方法讓用戶(hù)調(diào)用來(lái)改變集合的內(nèi)容)妆棒。
  • 若某屬性?xún)H可于對(duì)象內(nèi)部修改澡腾,則在“class-continuation分類(lèi)”中將其由readonly屬性擴(kuò)展為readwrite屬性沸伏。
  • 不要把可變的collection作為屬性公開(kāi),而應(yīng)提供相關(guān)方法动分,一次修改對(duì)象中的可變collection毅糟。

19 使用清晰而協(xié)調(diào)的命名方式

  • 起名時(shí)應(yīng)遵從標(biāo)準(zhǔn)的Objective-C命名規(guī)范,這樣創(chuàng)建出來(lái)的接口更容易為開(kāi)發(fā)者所理解澜公。
  • 方法名要言簡(jiǎn)意賅姆另,從左至右讀起來(lái)要像個(gè)日常用語(yǔ)中的句子才好。
  • 方法名利不要使用縮略后的類(lèi)型名稱(chēng)坟乾。
  • 給方法嗎起名時(shí)的第一要?jiǎng)?wù)就是確保其風(fēng)格與你自己的代碼或所要集成的框架相符迹辐。

20 為私有方法名加前綴

  • 給私有方法的名稱(chēng)加上前綴,這樣可以很容易的將其通公共方法區(qū)分開(kāi)甚侣。
  • 不要單用一個(gè)下劃線(xiàn)做私有方法的前綴明吩,因?yàn)檫@種做法的預(yù)留給蘋(píng)果公司用的。

21 理解Objective-C錯(cuò)誤模型

  • 只有發(fā)生了可使整個(gè)應(yīng)用程序崩潰的嚴(yán)重錯(cuò)誤時(shí)殷费,才使用異常印荔。OC在 ARC開(kāi)啟后, 發(fā)生了異常也不能保證資源的釋放, 因此不是"異常完全"的. (個(gè)人認(rèn)為拋出異常一般用于告訴調(diào)用者哪些方法未實(shí)現(xiàn)或者隱藏了父類(lèi)的行為等, 在調(diào)試時(shí)就可以發(fā)現(xiàn)問(wèn)題)
  • 在錯(cuò)誤不那么嚴(yán)重的情況下,可以指派委托方法來(lái)處理錯(cuò)誤详羡,也可把錯(cuò)誤信息放在NSError對(duì)象里仍律,經(jīng)由輸出參數(shù)返回給調(diào)用者。

22 理解NSCopying協(xié)議

  • 若想令自己所寫(xiě)的對(duì)象具有拷貝功能殷绍,則需實(shí)現(xiàn)NSCopying協(xié)議染苛。
  • 如果自定義的對(duì)象分為可變版本與不可變版本,那么就要同時(shí)實(shí)現(xiàn)NSCopying與NSMutableCopying協(xié)議主到。
    復(fù)制對(duì)象時(shí)需決定采用淺拷貝還是深拷貝茶行,一般情況下應(yīng)該盡量執(zhí)行淺拷貝。
    如果你所寫(xiě)的對(duì)象需要深拷貝登钥,那么可考慮新增一個(gè)專(zhuān)門(mén)執(zhí)行深拷貝的方法畔师。

協(xié)議與分類(lèi)

23 通過(guò)委托與數(shù)據(jù)源協(xié)議進(jìn)行對(duì)象間通信

委托屬性需定義成 weak, 因?yàn)閮啥疾⒎菗碛械牟⑾? 不然會(huì)產(chǎn)生 retain circle. protocol 可以通過(guò)@optional 定義非強(qiáng)制實(shí)現(xiàn)的方法, 當(dāng)調(diào)用時(shí)需要向?qū)ο蟀l(fā)送 respondsToSelector:消息, 確定方法是否被實(shí)現(xiàn)了

  • 委托模式為對(duì)象提供了一套接口,使其可由此將相關(guān)事件告知其他對(duì)象(如UITableViewDelegate)牧牢。
  • 將委托對(duì)象應(yīng)該支持的接口定義成協(xié)議看锉,在協(xié)議中把可能需要處理的事件定義成方法。
  • 當(dāng)某對(duì)象需要從另外一個(gè)對(duì)象中獲取數(shù)據(jù)時(shí)塔鳍,可使用委托模式伯铣。在這種情況下,該模式亦稱(chēng)數(shù)據(jù)源協(xié)議(如 UITableViewDataSource)轮纫。
  • 若有必要腔寡,可實(shí)現(xiàn)含有位段的結(jié)構(gòu)體,將委托對(duì)象是否能響應(yīng)相關(guān)協(xié)議方法這一信息緩存至其中掌唾。該方法的目的將可選方法的實(shí)現(xiàn)情況通過(guò)結(jié)構(gòu)體緩存起來(lái), 用結(jié)構(gòu)的每一位表示某一個(gè)方法是否實(shí)現(xiàn)了,以上.

24 將類(lèi)的實(shí)現(xiàn)代碼分散到便于管理的數(shù)個(gè)分類(lèi)之中

  • 使用分類(lèi)機(jī)制把類(lèi)的實(shí)現(xiàn)代碼劃分成易于管理的小塊放前。分類(lèi)文件的全名可以采用 ClassName+CategoryName(.h/.m)
  • 將應(yīng)該視為私有的方法歸入名叫Private的分類(lèi)中忿磅,以隱藏實(shí)現(xiàn)細(xì)節(jié)。

25 總是為第三方類(lèi)的分類(lèi)名稱(chēng)加前綴

  • 向第三方類(lèi)中添加分類(lèi)時(shí)凭语,總應(yīng)給其名稱(chēng)加上你專(zhuān)用的前綴葱她。
  • 向第三方類(lèi)中添加分類(lèi)時(shí),總應(yīng)給其中的方法名加上你專(zhuān)用的前綴似扔。

26 勿在分類(lèi)中聲明屬性

  • 把封裝數(shù)據(jù)所用的全部屬性都定義在主接口里吨些。分類(lèi)中定義的屬性不能自動(dòng)合成存取方法.
  • 在class-continuation分類(lèi)之外的其他分類(lèi)中,可以定義存取方法虫几,但盡量不要定義屬性锤灿。

27 使用class-continuation分類(lèi)隱藏實(shí)現(xiàn)細(xì)節(jié)(就是 Extension)

  • 通過(guò)class-continuation分類(lèi)向類(lèi)中新增實(shí)例變量挽拔。
  • 如果某屬性在主接口中聲明為只讀辆脸,而類(lèi)的內(nèi)部又要用設(shè)置方法修改此屬性,那么就在class-continuation分類(lèi)中將其擴(kuò)展為可讀寫(xiě)螃诅。
  • 把私有方法的原型聲明在class-continuation分類(lèi)里面啡氢。
  • 若想使類(lèi)遵循的協(xié)議不為人所知,則可于class-continuation分類(lèi)中聲明术裸。

28 通過(guò)協(xié)議提供匿名對(duì)象

本節(jié)總起來(lái)就是通過(guò)基于協(xié)議的多態(tài)特性, 定義 id<ProtocolType>類(lèi)型的指針, 可以指向任何實(shí)現(xiàn)了協(xié)議的對(duì)象.

  • 協(xié)議可在某種程度上提供匿名類(lèi)型倘是。具體的對(duì)象類(lèi)型可以淡化成遵從某些一的id類(lèi)型,協(xié)議里規(guī)定了對(duì)象所應(yīng)實(shí)現(xiàn)的方法袭艺。
  • 使用匿名對(duì)象來(lái)隱藏類(lèi)型名稱(chēng)或類(lèi)名搀崭。
  • 如果具體類(lèi)型不重要,重要的是對(duì)象能夠響應(yīng)(定義在協(xié)議里的)特定方法猾编,那么可使用匿名對(duì)象來(lái)表示瘤睹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市答倡,隨后出現(xiàn)的幾起案子轰传,更是在濱河造成了極大的恐慌,老刑警劉巖瘪撇,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获茬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡倔既,警方通過(guò)查閱死者的電腦和手機(jī)恕曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渤涌,“玉大人佩谣,你說(shuō)我怎么就攤上這事〖吣螅” “怎么了稿存?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵笨篷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓣履,道長(zhǎng)率翅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任袖迎,我火速辦了婚禮冕臭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘燕锥。我一直安慰自己辜贵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布归形。 她就那樣靜靜地躺著托慨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暇榴。 梳的紋絲不亂的頭發(fā)上厚棵,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音蔼紧,去河邊找鬼婆硬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奸例,可吹牛的內(nèi)容都是我干的彬犯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼查吊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谐区!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起菩貌,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤卢佣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后箭阶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虚茶,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年仇参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘹叫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈乒,死狀恐怖罩扇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤喂饥,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布消约,位于F島的核電站,受9級(jí)特大地震影響员帮,放射性物質(zhì)發(fā)生泄漏或粮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一捞高、第九天 我趴在偏房一處隱蔽的房頂上張望氯材。 院中可真熱鬧,春花似錦硝岗、人聲如沸氢哮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冗尤。三九已至,卻和暖如春贱除,著一層夾襖步出監(jiān)牢的瞬間生闲,已是汗流浹背媳溺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工月幌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬蔽。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓扯躺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蝎困。 傳聞我的和親對(duì)象是個(gè)殘疾皇子录语,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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