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

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

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

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

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

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

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

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

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

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

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

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

20 為私有方法名加前綴

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

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

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

22 理解NSCopying協(xié)議

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

協(xié)議與分類

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

委托屬性需定義成 weak, 因?yàn)閮啥疾⒎菗碛械牟⑾? 不然會(huì)產(chǎn)生 retain circle. protocol 可以通過@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í),可使用委托模式。在這種情況下,該模式亦稱數(shù)據(jù)源協(xié)議(如 UITableViewDataSource)。
  • 若有必要,可實(shí)現(xiàn)含有位段的結(jié)構(gòu)體,將委托對(duì)象是否能響應(yīng)相關(guān)協(xié)議方法這一信息緩存至其中。該方法的目的將可選方法的實(shí)現(xiàn)情況通過結(jié)構(gòu)體緩存起來, 用結(jié)構(gòu)的每一位表示某一個(gè)方法是否實(shí)現(xiàn)了,以上.

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

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

25 總是為第三方類的分類名稱加前綴

  • 向第三方類中添加分類時(shí),總應(yīng)給其名稱加上你專用的前綴。
  • 向第三方類中添加分類時(shí),總應(yīng)給其中的方法名加上你專用的前綴。

26 勿在分類中聲明屬性

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

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

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

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

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

  • 協(xié)議可在某種程度上提供匿名類型。具體的對(duì)象類型可以淡化成遵從某些一的id類型,協(xié)議里規(guī)定了對(duì)象所應(yīng)實(shí)現(xiàn)的方法。
  • 使用匿名對(duì)象來隱藏類型名稱或類名。
  • 如果具體類型不重要,重要的是對(duì)象能夠響應(yīng)(定義在協(xié)議里的)特定方法,那么可使用匿名對(duì)象來表示。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容