前言
凑巧得知了以下现象:
- 调用UIView子类的init方法会先去调用initWithFrame:
- 调用UIView子类的initWithFrame:不会调用init方法
一开始会很自然的认为initWithFrame:多一个参数的方法内部会调用init这个初始化方法,会对上面的现象感到奇怪。但是在用Xcode查看了init和initWithFrame:方法的说明后就了然了。
流程
先从frame这个UIView的属性入手,当用
1 | UIView *v = [[UIView alloc] init]; |
用lldb调试打印出frame
从得到的结果可知:就算只调用init方法,UIView对象的frame也是有值的?
- 类似Java类中的基本数据结构,都有默认值
直接设置frame属性,当前情况下,至少我没有写,虽然最终肯定是要进行设置的- 调用了initWithFrame:方法,传递的参数为CGRectZero
因为没有UIView的init方法的具体代码,所以只能算是*揣测*,根据实际的情况,再加上既然已经有了initWithFrame:方法设置frame,应该没必要搞那么麻烦,就第3种情况吧。
调用UIView子类的init方法会先去调用initWithFrame:,这个算是可以成立的
若init调用initWithFrame:(?),initWithFrame:自然就不会再调用init方法了。
实现
尝试去编写符合上面假设的代码
查看NSObject中的init方法的说明
至少可以得知两点
init是让子类实现初始化一个新对象的方法
NSObject类的init没有初始化操作,只是简单的返回了一个self指针
继承关系为:CustomView -> UIView -> UIResponder -> NSObject
NSObject类
1 | - (instancetype)init { |
UIView类
1 | - (instancetype)init { |
…
CustomUIView类
1 | - (instancetype)init { |
- CustomView对象调用init方法
- 调用UIView的init方法
- 调用NSObject的init方法,返回self指针
- self是CustomView对象,所以执行CustomView对象的initWithFrame:方法
- CustomView对象调用initWithFrame:对象
- 调用UIView的init方法
- 调用NSObject的init方法,返回self指针
- 根据传递参数设置frame属性值