setter可能产生副作用。
因为setter是与KVC编程相关的,所以在使用setter的时候可能会在无意中触发KVC,从而导致非预期的效果。
但是在初始化对象的时候,你只是想初始化,而不想要KVC。
当你初始化某对象并对其属性设值的时候,但是如果断点,你就会发现属性已经被设置了,但是init还没有被调用,所以此时对象中的实例变量还没有被初始化,所以此时的对象是不完整的。
所以为了防止这种后果的出现,你需要在init中对实例变量而不是通过setter进行初始化。
子类如此,那么父类也应该如此。这就是为啥子类对象在初始化的时候首先要调用父类的初始化方法。
这要从两方面来讲:
1、从继承层次的角度讲,子类的在初始化的时候如果不调用父类的init,就会导致子类中缺少了父类的成分,那就不符合IS-A原则了。从理论上来讲子类对象实例就不能调用父类的任何属性和方法,从实际效果来讲,编译器会报错提醒你没有调用父类的init方法。当然如果你不写初始化方法,编译器会自动完成这一步。
2、子类用init来初始化自己的实例变量,父类也必须如此,这样二者都能避免文章开头说的问题。这样连锁反应就会发生,那么继承层次上的所有类都可以避免这个问题。
网友评论