我的同事有时在重写ios方法时会调用super,有时则不会。这似乎主要基于他们的经验。是否有一个指导方针来决定是否调用super?
// Has super
override func awakeFromNib() {
super.awakeFromNib()
}
// No super
override func drawRect(rect: CGRect) {
}
在是否调用给定方法的超级实现方面,实际上没有一条经验法则。这应该根据超类对该方法实现的文档建议和您的要求来具体确定。
为了解释为什么你提供的两个例子可能是这样的,我们可以查看{{link1:-[UIView drawRect:]}的文档,其中写道:
如果您直接子类化UIView,则您实现此方法不需要调用super。但是,如果您正在子类化其他视图类,则应在实现中的某个时刻调用super。
以及{{link2:-[NSObject awakeFromNib]}的文档,其中写道:
您必须调用awakeFromNib的超级实现,以便父类有机会执行他们所需的任何其他初始化。虽然此方法的默认实现不执行任何操作,但许多UIKit类提供非空实现。
大多数情况下,您应该调用方法的超级实现(请参见下面的注释),这可能是一个安全的做法。但要注意,有些方法需要您调用它们的超级实现,有些则不需要,还有一些甚至要求您在覆盖时在特定点调用超级实现。因此,请记住,如果有疑问,请务必查阅文档。
UIViewController loadView
明确表示:“您对此方法的自定义实现不应调用super。”我的建议是始终检查文档,并在不确定时默认调用super(如果文档没有说明)。 Android相对于iOS的一个好处是您可以查看源代码并查看super实际执行了什么。 :-/ - i_am_jorf
awakeFromNib
时是否需要调用super
,必须阅读有关awakeFromNib
的文档等等。没有捷径可走。我的评论对所有人都有帮助。 - matt