直接訪問實例變量的init方法

setter可能產生副作用。
因為setter是與KVC編程相關的,所以在使用setter的時候可能會在無意中觸發KVC,從而導致非預期的效果。
但是在初始化對象的時候,你只是想初始化,而不想要KVC。
當你初始化某對象并對其屬性設值的時候,但是如果斷點,你就會發現屬性已經被設置了,但是init還沒有被調用,所以此時對象中的實例變量還沒有被初始化,所以此時的對象是不完整的。
所以為了防止這種后果的出現,你需要在init中對實例變量而不是通過setter進行初始化。

子類如此,那么父類也應該如此。這就是為啥子類對象在初始化的時候首先要調用父類的初始化方法。
這要從兩方面來講:
1、從繼承層次的角度講,子類的在初始化的時候如果不調用父類的init,就會導致子類中缺少了父類的成分,那就不符合IS-A原則了。從理論上來講子類對象實例就不能調用父類的任何屬性和方法,從實際效果來講,編譯器會報錯提醒你沒有調用父類的init方法。當然如果你不寫初始化方法,編譯器會自動完成這一步。
2、子類用init來初始化自己的實例變量,父類也必須如此,這樣二者都能避免文章開頭說的問題。這樣連鎖反應就會發生,那么繼承層次上的所有類都可以避免這個問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容