第6條:理解屬性這一概念
可以使用@property語法來定義對象中所封裝的數(shù)據(jù)箱歧。
通過“特質(zhì)”來指定存取數(shù)據(jù)所需的正確語句矾飞。
在設(shè)置屬性所對應的實例變量時,一定要遵從該屬性所聲明的語義呀邢。
開發(fā)iOS程序是應盡量使用nonatomic屬性洒沦,因為atomic屬性會嚴重影響性能。
@synthesize語法指定實例變量的名字价淌。@synthesize firstName = _myFirstName;
@dynamic:它會告訴編譯器:不要自動創(chuàng)建實例變量和存儲方法申眼。
assign:簡單賦值操作。
strong:設(shè)置方法先保留新值蝉衣,并釋放舊值括尸,然后將新值設(shè)置上去。
weak:設(shè)置方法既不保留新值病毡,也不釋放舊值濒翻。摧毀時,屬性值清空(nil out);
unsafa_unretained:與assign相同啦膜,但摧毀時肴焊,屬性值不會自動清空,與weak有區(qū)別功戚。
copy:設(shè)置方法不保留新值,而是將其拷貝似嗤。
第7條:在對象內(nèi)部盡量直接訪問實例變量
由于不經(jīng)過OC的“方法派發(fā)”步驟啸臀,所以直接訪問實例變量的速度較快。在這種情況下烁落,編譯器所生成的代碼會直接訪問保存對象實例變量的那塊內(nèi)存乘粒。
直接訪問實例變量時,不會調(diào)用其“設(shè)置方法”伤塌,這就繞過了為其屬性所定義的“內(nèi)存管理語義”灯萍。比方說,如果在ARC下直接訪問一個聲明為copy的屬性每聪,那么并不會拷貝該屬性旦棉,只會保留新值齿风,并釋放舊值。
如果直接訪問實例變量绑洛,那么不會觸發(fā)“鍵值觀測”(KVO)通知救斑。這樣做是否會產(chǎn)生問題,還取決于具體的對象行為真屯。
通過屬性來訪問有助于排查與之相關(guān)的錯誤脸候。
在對象內(nèi)部讀取數(shù)據(jù)時,應該直接通過實例變量來讀绑蔫,而在寫入數(shù)據(jù)時运沦,則應通過屬性來寫。
在初始化方法及dealloc方法中配深,總是應該直接通過實例變量來讀寫數(shù)據(jù)携添。
有時會使用懶加載,這種情況下凉馆,需要通過屬性來讀取數(shù)據(jù)薪寓。
第8條:理解“對象等同性”這一概念
若想檢測對象的等同性,請?zhí)峁癷sEqual:”與hash方法澜共。
相同的對象必須具有相同的哈希碼向叉,但是兩個哈希碼相同的對象卻未必相同。
不要盲目地逐個檢測每條屬性嗦董,而是應該依照具體需求來制定檢測方案母谎。
編寫hash方法時,應該使用計算速度快而且哈希碼碰撞幾率低的算法京革。
第9條:以“類族模式”隱藏實現(xiàn)細節(jié)
類族模式可以把實現(xiàn)細節(jié)隱藏在一套簡單的公共接口后面奇唤。
系統(tǒng)框架中經(jīng)常使用類族。
從類族的公共抽象基類中繼承子類時要小心匹摇,若有開發(fā)文檔咬扇,首先閱讀。
第10條:在既有類中使用關(guān)聯(lián)對象存放自定義數(shù)據(jù)
可以通過“關(guān)聯(lián)對象”機制來把兩個對象連起來廊勃。
定義關(guān)聯(lián)對象時可指定內(nèi)存管理語義懈贺,用以模仿定義屬性時所采用的“擁有關(guān)系”與“非擁有關(guān)系”。
只有在其他做法不可行時才應選擇關(guān)聯(lián)對象坡垫,因為這種做法通常會引入難以查找的bug梭灿。
第11條:理解objc_msgSend的作用
消息由接受者、選擇子及參數(shù)構(gòu)成冰悠。給某對象“發(fā)送消息(invoke a message)”也就是相當于在該對象上“調(diào)用方法”(call a method)堡妒。
發(fā)給某對象的全部消息都要由“動態(tài)消息派發(fā)系統(tǒng)”(dynamic message dispatch sysytem)來處理,該系統(tǒng)會查出對應的方法溉卓,并執(zhí)行其代碼皮迟。
第12條:理解消息轉(zhuǎn)發(fā)機制
若對象無法響應某個選擇子搬泥,則進入消息轉(zhuǎn)發(fā)流程。
通過運行期的動態(tài)方法解析功能万栅,我們可以在需要用到某個方法時再將其加入類中佑钾。
對象可以把其無法解讀的某些選擇子轉(zhuǎn)交給其他對象處理。
經(jīng)過上述兩步之后烦粒,如果還是沒有辦法處理選擇子休溶,那就啟動完整的消息轉(zhuǎn)發(fā)機制。
第13條:用“方法調(diào)配技術(shù)”調(diào)試“黑盒方法”
在運行期扰她,可以向類中新增或替換選擇子所對應的方法實現(xiàn)兽掰。
使用另一份實現(xiàn)來替換原有的方法實現(xiàn),這道工序叫做“方法調(diào)配”徒役,開發(fā)者常用此技術(shù)向原有實現(xiàn)中添加新功能孽尽。
一般來說,只有調(diào)試程序的時候才需要在運行期修改方法實現(xiàn)忧勿,這種方法不易濫用杉女。
第14條:理解“類對象”的用意
每個實例都有一個指向 Class 對象的指針,用以表明其類型鸳吸,而這些 Class 對象則構(gòu)成了類的繼承體系熏挎。
如果對象類型無法再編譯期確定,那么就應該使用類型信息查詢(is kind of class)來探知晌砾。
盡量使用類型信息查詢方法來確定對象類型坎拐,而不要直接比較類對象,因為某些對象可能實現(xiàn)了消息轉(zhuǎn)發(fā)功能养匈。