当我在子类中初始化我的UIView时会发生什么?

时间:2015-02-19 09:17:18

标签: ios swift uiview initializing

A.swift

class A: UIView {

    override init() {
        super.init()
        println("init A")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        println("initFrame A")
    }
}

B.swift

class B: A {

    override init() {
        super.init()
        //P1
        println("init B")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        println("initFrame B")
    }
}

然后我称之为B()

我有一个输出:

initFrame A
initFrame B
init A
init B

我尝试确定什么?何时? ...... B()之后。我希望完全理解它。

    init()
  1. A 位于super.init()
  2. init()中的
  3. Ainit()
  4. B 位于super.init()
  5. init()中的
  6. Binit()
  7. UIView 位于super.init()
  8. init()中的
  9. UIView

    现在我们在P1点,对吧?

    1. init()使用init(frame:)
    2. B中调用CGRectZero 位于super.init(frame:)init(frame:)中的
    3. Binit(frame:)
    4. A 位于super.init(frame:)
    5. init(frame:)中的
    6. Ainit(frame:)
    7. UIView 位于super.init(frame:)
    8. init(frame:)中的
    9. UIView

      现在我们回来了

      1. init(frame:)
      2. 中调用了UIView的其余部分
      3. init(frame:) - >中调用A的其余部分 initFrame A
      4. init(frame:) - >中调用B的其余部分 initFrame B
      5. 问题是现在发生了什么?我们现在在哪里? (在init() UIView内?)在哪里打印init Ainit B的行?

        感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  1. B()致电B' s init()
  2. 这会导致拨打init()超类B中定义的A(由于super.init()中的B&#39}。 s init()
  3. 这反过来导致调用init()超类A中定义的UIView(由于super.init() A ' s init()
  4. UIView' s init()在当前实例上调用init(frame: CGRectZero)
  5. 由于当前实例属于类B,而类B会覆盖init(frame: CGRect),因此会调用B自己的方法实现
  6. 这会调用A init(frame: CGRectZero)super.init(frame: frame) B中的init(frame: CGRect) < / LI>
  7. 因此,UIView init(frame: CGRectZero)被调用(归因于super.init(frame: frame)自己的A {/ 1}}
  8. 调用链
  9. 结束
  10. 很好,现在我们回到A init(frame: CGRectZero)(列表中的第6点),打印initFrame A
  11. 返回B init(frame: CGRectZero)(第5点),打印initFrame B
  12. 现在又回到UIView&#39; init()(第3点),它不会打印任何内容
  13. 我们返回A&#39; init()(第2点),打印initA
  14. 最后,我们在B init()(第1点)完成了我们的行程,打印initB,标有P1
  15. 如果步骤清楚,请告诉我,如果我需要添加更多详细信息以改进解释:我知道它有点令人费解。