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

标签 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() 之后调用什么?以及何时?...。我想彻底理解它。

  1. A 中的 init()
  2. Ainit() 中的 super.init()
  3. B 中的 init()
  4. Binit() 中的 super.init()
  5. UIView 中的 init()
  6. UIViewinit() 中的 super.init()

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

  • init() 使用 CGRectZero 调用 B 中的 init(frame:)
  • Binit(frame:) 中的 super.init(frame:)
  • A 中的 init(frame:)
  • Ainit(frame:) 中的 super.init(frame:)
  • UIView 中的 init(frame:)
  • UIViewinit(frame:) 中的 super.init(frame:)
  • 现在我们回来了

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

    感谢您的帮助。

    最佳答案

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

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

    关于ios - 当我在子类中初始化我的 UIView 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602501/

    相关文章:

    swift - 实现 ||= 和 &&= 运算符 : operator implementation without matching operator declaration

    ios - 是否有跟踪前一个屏幕并使用它来更改另一个屏幕中的内容的操作?

    ios - 添加到 sharedApplication 的 keyWindow 时,UIView 未注册触摸事件

    ios - 最小化窗口动画,但对于 iOS?

    ios - 通过当前模态执行 Segue 后出现 'found nil' 异常

    ios - Swift 使用 firebase 在聊天中显示最后发送的消息

    objective-c - 许多应用程序在 iO 中使用一个商店

    ios - 如何在表格中显示自定义页脚 View ?

    ios - 从 watch os2 在前台打开 iPhone

    ios - 带有 swift 和 Storyboard的 iOS8 中的简单表格 View