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()
之后调用什么?以及何时?...。我想彻底理解它。
A
中的init()
A
中init()
中的super.init()
B
中的init()
B
中init()
中的super.init()
UIView
中的init()
UIView
中init()
中的super.init()
现在我们处于P1
点,对吗?
init()
使用CGRectZero
调用B
中的init(frame:)
B
中init(frame:)
中的super.init(frame:)
A
中的init(frame:)
A
中init(frame:)
中的super.init(frame:)
- UIView 中的
init(frame:)
UIView
中init(frame:)
中的super.init(frame:)
现在我们回来了
- 在
UIView
中调用init(frame:)
的其余部分 - 在
A
中调用了init(frame:)
的其余部分 --> initFrame A - 在
B
中调用了init(frame:)
的其余部分 --> initFrame B
问题是现在发生了什么?我们现在在哪里? (在 UIView
的 init()
内部?)在哪里打印 init A
和 init B
行?
感谢您的帮助。
最佳答案
B()
调用B
的init()
- 这导致调用
B
的父类(super class)A
中定义的init()
(由于super.init( )
在B
的init()
) - 这反过来会导致调用
A
的父类(super class)UIView
中定义的init()
(由于A
的init()
) 中的 super.init()
UIView
的init()
在当前实例上调用init(frame: CGRectZero)
- 由于当前实例属于
B
类,并且B
类覆盖了init(frame: CGRect)
,B
自己实现的方法被调用 - 这导致调用
A
的init(frame: CGRectZero)
(由于super.init(frame: frame)
在B
的init(frame: CGRect)
) - 因此,
UIView
的init(frame: CGRectZero)
被调用(由于super.init(frame: frame)
在A
自己的实现中) - 调用链到此结束
- 很好,现在我们回到
A
的init(frame: CGRectZero)
(列表中的第 6 点),它打印initFrame一个
- 回到
B
的init(frame: CGRectZero)
(第 5 点),它打印initFrame B
- 现在再次回到
UIView
的init()
(第 3 点),它不打印任何内容 - 我们返回
A
的init()
(第 2 点),它打印initA
- 最后,我们在
B
的init()
(第 1 点)结束我们的旅程,它打印initB
,您用P1
请让我知道步骤是否清楚,或者我是否需要添加更多细节来改进解释:我知道这有点令人费解。
关于ios - 当我在子类中初始化我的 UIView 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602501/