setter可能產(chǎn)生副作用贺纲。
因?yàn)閟etter是與KVC編程相關(guān)的航闺,所以在使用setter的時(shí)候可能會(huì)在無(wú)意中觸發(fā)KVC,從而導(dǎo)致非預(yù)期的效果猴誊。
但是在初始化對(duì)象的時(shí)候潦刃,你只是想初始化,而不想要KVC懈叹。
當(dāng)你初始化某對(duì)象并對(duì)其屬性設(shè)值的時(shí)候乖杠,但是如果斷點(diǎn),你就會(huì)發(fā)現(xiàn)屬性已經(jīng)被設(shè)置了澄成,但是init還沒(méi)有被調(diào)用胧洒,所以此時(shí)對(duì)象中的實(shí)例變量還沒(méi)有被初始化,所以此時(shí)的對(duì)象是不完整的墨状。
所以為了防止這種后果的出現(xiàn)卫漫,你需要在init中對(duì)實(shí)例變量而不是通過(guò)setter進(jìn)行初始化。
子類如此肾砂,那么父類也應(yīng)該如此列赎。這就是為啥子類對(duì)象在初始化的時(shí)候首先要調(diào)用父類的初始化方法。
這要從兩方面來(lái)講:
1镐确、從繼承層次的角度講包吝,子類的在初始化的時(shí)候如果不調(diào)用父類的init,就會(huì)導(dǎo)致子類中缺少了父類的成分源葫,那就不符合IS-A原則了诗越。從理論上來(lái)講子類對(duì)象實(shí)例就不能調(diào)用父類的任何屬性和方法,從實(shí)際效果來(lái)講臼氨,編譯器會(huì)報(bào)錯(cuò)提醒你沒(méi)有調(diào)用父類的init方法掺喻。當(dāng)然如果你不寫(xiě)初始化方法板壮,編譯器會(huì)自動(dòng)完成這一步恨胚。
2、子類用init來(lái)初始化自己的實(shí)例變量,父類也必須如此缚甩,這樣二者都能避免文章開(kāi)頭說(shuō)的問(wèn)題。這樣連鎖反應(yīng)就會(huì)發(fā)生竭宰,那么繼承層次上的所有類都可以避免這個(gè)問(wèn)題兼贡。