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

What happens when I am initializing my UIView in subclasses?

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() 之后。我希望完全理解它。

  1. init()A
  2. super.init()init()A
  3. init()B
  4. super.init()init()B
  5. init()UIView
  6. super.init()init()UIView

现在我们处于 P1 点,对吗?

  1. init()B 中用 CGRectZero
  2. 调用 init(frame:)
  3. super.init(frame:)init(frame:)B
  4. init(frame:)A
  5. super.init(frame:)init(frame:)A
  6. init(frame:)UIView
  7. super.init(frame:)init(frame:)UIView

现在我们要回来了

  1. UIView
  2. 中调用了 init(frame:) 的其余部分
  3. A中调用了init(frame:)的其余部分 --> initFrame A
  4. B中调用了init(frame:)的其余部分 --> initFrame B

问题是现在发生了什么?我们现在在哪里? (在 UIView 中的 init() 内?) init Ainit B 的行打印在哪里?

感谢您的帮助。

  1. B() 调用 Binit()
  2. 这导致调用 B 的 superclass A 中定义的 init()(由于 super.init()Binit())
  3. 反过来,这会导致调用 A 的 superclass UIView 中定义的 init()(由于 super.init()Ainit())
  4. UIViewinit() 在当前实例
  5. 上调用 init(frame: CGRectZero)
  6. 由于当前实例是 class B,并且 class B 覆盖 init(frame: CGRect)B 自己的实现方法被调用
  7. 这导致调用 Ainit(frame: CGRectZero)(由于 Binit(frame: CGRect) 中的 super.init(frame: frame)
  8. 因此,UIViewinit(frame: CGRectZero) 被调用(由于 A 自己的实现中的 super.init(frame: frame)
  9. 调用链到此结束
  10. 很好,现在我们回到 Ainit(frame: CGRectZero)(列表中的第 6 点),它打印 initFrame A
  11. 返回到 Binit(frame: CGRectZero)(第 5 点),它打印 initFrame B
  12. 现在再次回到 UIViewinit()(第 3 点),它不打印任何内容
  13. 我们return到Ainit()(第2点),打印initA
  14. 最后,我们在 Binit()(第 1 点)结束了我们的旅程,它打印了 initB,您用 P1[=72= 标记了]

请让我知道步骤是否清晰,或者我是否需要添加更多细节以改进解释:我知道这有点令人费解。