小坑
自定義的邏輯可以放在
initWithFrame
红省,不要放在init
类腮。不要兩個(gè)方法都放蚜枢,因?yàn)槟惴?initWithFrame
就足夠了需频,即使你實(shí)際只調(diào)用init
來初始化昭殉。這是因?yàn)椋?code>init 內(nèi)部會(huì)調(diào)用父類的
initWithFrame:
方法藐守,只不過傳入的 frame 的值為0卢厂。然后任内,父類的initWithFrame:
方法發(fā)現(xiàn)當(dāng)前的調(diào)用對(duì)象是子類對(duì)象融柬,所以就調(diào)用了子類的initWithFrame
方法了越除。這是一個(gè)多態(tài)的應(yīng)用。
驗(yàn)證
- 打個(gè)斷點(diǎn)可以查看調(diào)用棧
結(jié)論
init
方法最終會(huì)調(diào)用自己的initWithFrame:
方法掷空,所以不要兩個(gè)方法都去實(shí)現(xiàn)护锤,兩個(gè)都去實(shí)現(xiàn)就重復(fù)執(zhí)行了烙懦。一般可能也看不出來影響亏较,但在要添加KVO觀察者邏輯的時(shí)候就非常致命。一般只實(shí)現(xiàn)
initWithFrame:
即可巡通,在這里面放你自己的初始化邏輯。這樣一來舍哄,當(dāng)你創(chuàng)建對(duì)象的時(shí)候就可以靈活選擇:既可以通過
init
來初始化宴凉,也可以通過initWithFrame:
來初始化。像上面的截圖就是錯(cuò)誤的演示表悬,
init
那一部分完全沒必要弥锄。