小坑
自定义的逻辑可以放在
initWithFrame
,不要放在init
。不要两个方法都放,因为你放initWithFrame
就足够了,即使你实际只调用init
来初始化。这是因为,
init
内部会调用父类的initWithFrame:
方法,只不过传入的 frame 的值为0。然后,父类的initWithFrame:
方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame
方法了。这是一个多态的应用。
验证
- 打个断点可以查看调用栈
结论
init
方法最终会调用自己的initWithFrame:
方法,所以不要两个方法都去实现,两个都去实现就重复执行了。一般可能也看不出来影响,但在要添加KVO观察者逻辑的时候就非常致命。一般只实现
initWithFrame:
即可,在这里面放你自己的初始化逻辑。这样一来,当你创建对象的时候就可以灵活选择:既可以通过
init
来初始化,也可以通过initWithFrame:
来初始化。像上面的截图就是错误的演示,
init
那一部分完全没必要。