美文网首页
initWithFrame initWithCode aw

initWithFrame initWithCode aw

作者: Super_Chester | 来源:发表于2018-06-07 14:10 被阅读0次

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

    相关文章

      网友评论

          本文标题:initWithFrame initWithCode aw

          本文链接:https://www.haomeiwen.com/subject/zehbsftx.html