第二章 對(duì)象、消息、運(yùn)行期
第6條:理解“屬性”這一概念
要點(diǎn):
1、可以用@property語法來定義對(duì)象中所封裝的數(shù)據(jù)。
2、通過“特質(zhì)”來指定存儲(chǔ)數(shù)據(jù)所需的正確語義。
3、在設(shè)置屬性所對(duì)應(yīng)的實(shí)例變量時(shí),一定要遵從該屬性所聲明的語義。
4、開發(fā)iOS程序時(shí)應(yīng)該使用nonatomic屬性,因?yàn)閍tomic屬性會(huì)嚴(yán)重影響性能。
第7條:在對(duì)象內(nèi)部盡量直接訪問實(shí)例變量
要點(diǎn):
1、在對(duì)象內(nèi)部讀取數(shù)據(jù)時(shí),應(yīng)該直接通過實(shí)例變量來讀,而寫入數(shù)據(jù)時(shí),則應(yīng)通過屬性來寫。
2、在初始化方法及dealloc方法中,總是應(yīng)該直接通過實(shí)例變量來讀寫數(shù)據(jù)。
3、有時(shí)會(huì)使用惰性初始化技術(shù)配置某份數(shù)據(jù),這種情況下,需要通過屬性來讀取數(shù)據(jù)。
第8條:理解“對(duì)象等同性”這一概念
要點(diǎn):
1、若想檢測(cè)對(duì)象的等同性,請(qǐng)?zhí)峁癷sEqual:”與hash方法。
2、相同的對(duì)象必須具有相同的哈希碼,但是兩個(gè)哈希碼相同的對(duì)象卻未必相同。
3、不要盲目地逐個(gè)檢測(cè)每條屬性,而是應(yīng)該依照具體需求來制定檢測(cè)方案。
4、編寫hash方法時(shí),應(yīng)該使用計(jì)算速度快而且哈希碼碰撞幾率低的算法。
第9條:以“類族模式”隱藏實(shí)現(xiàn)細(xì)節(jié)
要點(diǎn):
1、類族模式可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在一套簡(jiǎn)單的公共接口后面。
2、系統(tǒng)框架中經(jīng)常使用類。
3、從類族的公共抽象基類中繼承子類時(shí)要當(dāng)心,若有開發(fā)文檔,則應(yīng)首先閱讀。
第10條:在既有類中使用關(guān)聯(lián)對(duì)象存放自定義數(shù)據(jù)
要點(diǎn):
1、可以通過“關(guān)聯(lián)對(duì)象”機(jī)制來把兩個(gè)對(duì)象連起來。
2、定義關(guān)聯(lián)對(duì)象時(shí)可指定內(nèi)存管理語義,用以模仿定義屬性時(shí)所采用的“擁有關(guān)系”與“非擁有關(guān)系”。
3、只有在其他做法不可行時(shí)才應(yīng)選用關(guān)聯(lián)對(duì)象,因?yàn)檫@種做法通常會(huì)引入難于查找的bug。
第11條:理解objc_msgSend的作用
要點(diǎn):
1、消息由接收者、選擇子及參數(shù)構(gòu)成。給某對(duì)象“發(fā)送消息”也就相當(dāng)于在該對(duì)象上“調(diào)用方法”。
2、發(fā)給某對(duì)象的全部消息都要由“動(dòng)態(tài)消息派發(fā)系統(tǒng)”來處理,該系統(tǒng)會(huì)查出對(duì)應(yīng)的方法,并執(zhí)行其代碼。
第12條:理解消息轉(zhuǎn)發(fā)機(jī)制
要點(diǎn):
1、若對(duì)象無法響應(yīng)某個(gè)選擇子,則進(jìn)入消息轉(zhuǎn)發(fā)流程。
2、通過運(yùn)行期的動(dòng)態(tài)方法解析功能,我們可以在需要用到某個(gè)方法時(shí)再將其加入類中。
3、對(duì)象可以把其無法解讀的某些選擇子轉(zhuǎn)交給其他對(duì)象來處理。
4、經(jīng)過上述兩步之后,如果還是沒辦法處理選擇子,那就啟動(dòng)完整的消息轉(zhuǎn)發(fā)機(jī)制。
第13條:用“方法調(diào)配技術(shù)”調(diào)試“黑盒方法”
要點(diǎn):
1、在運(yùn)行期,可以向類中新增或替換選擇子所對(duì)應(yīng)的方法實(shí)現(xiàn)。
2、使用另一份實(shí)現(xiàn)來替換原有的方法實(shí)現(xiàn),這道工序叫做“方法調(diào)配”,開發(fā)者常用此項(xiàng)技術(shù)原有實(shí)現(xiàn)中添加新功能。
3、一般來說,只有調(diào)試程序的時(shí)候才需要在運(yùn)行期修改方法實(shí)現(xiàn),這種做法不宜濫用。
第14條:理解“類對(duì)象”的用意
要點(diǎn):
1、每個(gè)實(shí)例都有一個(gè)指向Class對(duì)象的指針。用以表明其類型,而這些Class對(duì)象則構(gòu)成了類的繼承體系。
2、如果對(duì)象類型無法在編譯期確定,那么就應(yīng)該使用類型信息查詢方法來探知。
3、盡量使用類型信息查詢方法來確定對(duì)象類型,而不要直接比較類對(duì)象,因?yàn)槟承?duì)象可能實(shí)現(xiàn)了消息轉(zhuǎn)發(fā)功能。