Objective-C 【init/initWithFrame调用机制】
2017-12-23 18:52
211 查看
这是一个自定义view:
现在我调用它的init方法:
控制台打印信息是:
2017-10-09 11:14:35.224 block[2391:262544] 调用了initWithFrame
2017-10-09 11:14:35.225 block[2391:262544] 调用了init
问:
为什么先打印的是initWithFrame而不是init?
答:
代码调用过程如下:
动态查找到 MyView 的 init 方法
调用 super init 方法
super init 方法内部执行的是 [super initWithFrame:CGRectZero]
然后 super 会发现 MyView 实现了 initWithFrame 方法
转而执行 [MyView initWithFrame:CGRectZero]
最后再执行 init 其余部分
关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上。
或者:
init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。
@implementation MyView - (instancetype)init { if (self = [super init]) { NSLog(@"调用了init"); } return self; } - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { NSLog(@"调用了initWithFrame"); } return self; } @end
现在我调用它的init方法:
MyView *myView = [[MyView alloc] init];
控制台打印信息是:
2017-10-09 11:14:35.224 block[2391:262544] 调用了initWithFrame
2017-10-09 11:14:35.225 block[2391:262544] 调用了init
问:
为什么先打印的是initWithFrame而不是init?
答:
MyView *myView = [[MyView alloc] init];
代码调用过程如下:
动态查找到 MyView 的 init 方法
调用 super init 方法
super init 方法内部执行的是 [super initWithFrame:CGRectZero]
然后 super 会发现 MyView 实现了 initWithFrame 方法
转而执行 [MyView initWithFrame:CGRectZero]
最后再执行 init 其余部分
关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上。
或者:
init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。
相关文章推荐
- Objective-C 【init/initWithFrame调用机制】
- UIView及其子对象的init和initWithFrame的调用过程
- 用UIButton的类方法ButtonWithType创建时调用的是initWithFrame方法
- cell的init会调用内部的initWithStyle,ui控件init最终会调用initWithFrame
- initWithFrame调用
- initWithFrame什么时候调用
- initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
- [置顶] UIView的init与initWithFrame的调用顺序
- iOS: initwithframe什么时候会被调用?
- initWithFrame和initWithCoder使用技巧,以及他们什么时候被调用,自定义控件必须具备三个方法initWithFrame和initWithCoder以及drawRect
- [BS-05] init、initWithFrame和initWithCoder的区别
- init: 和 initWithFrame:
- objective-c 读取文本文件编码方式(stringWithContentsOfFile和initWithContentsOfFile)
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的调用时间及用法
- init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?
- initWithNibName,initWithCoder,initWithFrame
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的调用时间及用法
- _mapView=[[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];报错
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)