当我在子类中初始化我的 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()
之后。我希望完全理解它。
init()
在 A
super.init()
在 init()
在 A
init()
在 B
super.init()
在 init()
在 B
init()
在 UIView
super.init()
在 init()
在 UIView
现在我们处于 P1
点,对吗?
init()
在 B
中用 CGRectZero
调用 init(frame:)
super.init(frame:)
在 init(frame:)
在 B
init(frame:)
在 A
super.init(frame:)
在 init(frame:)
在 A
init(frame:)
在 UIView
super.init(frame:)
在 init(frame:)
在 UIView
现在我们要回来了
- 在
UIView
中调用了 init(frame:)
的其余部分
- 在
A
中调用了init(frame:)
的其余部分 --> initFrame A
- 在
B
中调用了init(frame:)
的其余部分 --> initFrame B
问题是现在发生了什么?我们现在在哪里? (在 UIView
中的 init()
内?) init A
和 init B
的行打印在哪里?
感谢您的帮助。
B()
调用 B
的 init()
- 这导致调用
B
的 superclass A
中定义的 init()
(由于 super.init()
在 B
的 init()
)
- 反过来,这会导致调用
A
的 superclass UIView
中定义的 init()
(由于 super.init()
在 A
的init()
)
UIView
的 init()
在当前实例 上调用 init(frame: CGRectZero)
- 由于当前实例是 class
B
,并且 class B
覆盖 init(frame: CGRect)
,B
自己的实现方法被调用
- 这导致调用
A
的 init(frame: CGRectZero)
(由于 B
的 init(frame: CGRect)
中的 super.init(frame: frame)
)
- 因此,
UIView
的 init(frame: CGRectZero)
被调用(由于 A
自己的实现中的 super.init(frame: frame)
)
- 调用链到此结束
- 很好,现在我们回到
A
的 init(frame: CGRectZero)
(列表中的第 6 点),它打印 initFrame A
- 返回到
B
的 init(frame: CGRectZero)
(第 5 点),它打印 initFrame B
- 现在再次回到
UIView
的 init()
(第 3 点),它不打印任何内容
- 我们return到
A
的init()
(第2点),打印initA
- 最后,我们在
B
的 init()
(第 1 点)结束了我们的旅程,它打印了 initB
,您用 P1
[=72= 标记了]
请让我知道步骤是否清晰,或者我是否需要添加更多细节以改进解释:我知道这有点令人费解。
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()
在A
super.init()
在init()
在A
init()
在B
super.init()
在init()
在B
init()
在UIView
super.init()
在init()
在UIView
现在我们处于 P1
点,对吗?
init()
在B
中用CGRectZero
调用 super.init(frame:)
在init(frame:)
在B
init(frame:)
在A
super.init(frame:)
在init(frame:)
在A
init(frame:)
在UIView
super.init(frame:)
在init(frame:)
在UIView
init(frame:)
现在我们要回来了
- 在
UIView
中调用了 - 在
A
中调用了init(frame:)
的其余部分 --> initFrame A - 在
B
中调用了init(frame:)
的其余部分 --> initFrame B
init(frame:)
的其余部分
问题是现在发生了什么?我们现在在哪里? (在 UIView
中的 init()
内?) init A
和 init B
的行打印在哪里?
感谢您的帮助。
B()
调用B
的init()
- 这导致调用
B
的 superclassA
中定义的init()
(由于super.init()
在B
的init()
) - 反过来,这会导致调用
A
的 superclassUIView
中定义的init()
(由于super.init()
在A
的init()
) UIView
的init()
在当前实例 上调用 - 由于当前实例是 class
B
,并且 classB
覆盖init(frame: CGRect)
,B
自己的实现方法被调用 - 这导致调用
A
的init(frame: CGRectZero)
(由于B
的init(frame: CGRect)
中的super.init(frame: frame)
) - 因此,
UIView
的init(frame: CGRectZero)
被调用(由于A
自己的实现中的super.init(frame: frame)
) - 调用链到此结束
- 很好,现在我们回到
A
的init(frame: CGRectZero)
(列表中的第 6 点),它打印initFrame A
- 返回到
B
的init(frame: CGRectZero)
(第 5 点),它打印initFrame B
- 现在再次回到
UIView
的init()
(第 3 点),它不打印任何内容 - 我们return到
A
的init()
(第2点),打印initA
- 最后,我们在
B
的init()
(第 1 点)结束了我们的旅程,它打印了initB
,您用P1
[=72= 标记了]
init(frame: CGRectZero)
请让我知道步骤是否清晰,或者我是否需要添加更多细节以改进解释:我知道这有点令人费解。