initWithFrame initWithCode awakeFormNib 这三种 其中
initWithFrame 是纯代码创建时会调用 initWithCode awakeFormNib是使用SB 或者XIB时会掉调用,顺序是:initWithCoder -> awakeFromNib
在viewDidLoad之前,由于是storyboard上创建的类,会先执行好,且会顺序走 initWithCoder、awakeFromNib两个方法
到viewDidLoad之后,执行到用代码创建的view,只会走 initWithFrame 方法
视图的创建的两种方式:
方式1 通过initwithFrame方式创建视图 UIView *view = [UIView alloc]]initFrame:]
调用顺序:
1 : setFrame
2:initWithFrame
3:layoutSubviews
4:drawRect
方式2 : 先alloc init 然后再设置frame
1.动态查找到 MyView 的 init 方法
调用 super init 方法
super init 方法内部执行的是 [super initWithFrame:CGRectZero]
然后 super 会发现 MyView 实现了 initWithFrame 方法
转而执行 [MyView initWithFrame:CGRectZero]
最后再执行 init 其余部分
关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上。
1 setFrame
2 init
3 应为我在外面设置了fram所以这里再次调用setFrame
4 layoutSubviews
5 drawRect
1.要重写UIView的initWithFrame:方法而不是init方法
为什么呢?因为当外部调用init的方法的时候,其内部也会默默地调用initWithFrame:方法,你不能保证别的同事在调用你的类的时候不会直接调用initWithFrame:方法,这时如果你仅重写了init方法,那么两个子控件便无从创建.
例如: label.frame = CGRectMake(0,self.frame.size.height - 20, 100, 20),这样写会有问题,因为self.frame可能还没有赋值,所以一般在layoutSubView中写。
网友评论