initWithFrame initWithCode aw

2018-06-07  本文已影响0人  Super_Chester

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中写。

上一篇下一篇

猜你喜欢

热点阅读