我的同事有时会在覆盖ios方法时调用super,有时候不会。这似乎主要基于他们的经验。在决定是否打电话给超级时,是否有经验法则?
前:
// Has super
override func awakeFromNib() {
super.awakeFromNib()
}
// No super
override func drawRect(rect: CGRect) {
}
答案 0 :(得分:7)
您是否应该调用给定方法的超级实现并不是一个经验法则。这应该根据具体情况确定,具体取决于超类的文档中的建议。该方法的实施,以及您的要求。
为了解释为什么你所包含的两个例子可能就是这样,我们可以查看-[UIView drawRect:]的文档,其中说明:
如果直接子类化UIView,则执行此方法 不需要打电话给超级。但是,如果你是一个子类 不同的视图类,你应该在你的某个时刻调用super 实施
以及-[NSObject awakeFromNib]的文档,其中声明:
您必须调用awakeFromNib的超级实现来提供父级 对他们进行任何额外初始化的机会进行分类 要求。虽然这个方法的默认实现确实如此 没有,许多UIKit类提供非空实现。
大多数情况下,你可以安全地打电话给方法的超级实现(见下面的评论)。但是,请注意,某些方法要求您调用其超级实现,有些方法不需要,有些方法甚至要求您在覆盖中的特定点调用超级实现。所以请记住,如有疑问,请务必查阅文档。
答案 1 :(得分:0)
向super发送消息是一种调用继承链上的超类定义的方法实现的方法。 super的最常见用法是覆盖方法。调用super将允许父类做一些准备。如果你重写了一个方法,你必须调用super,否则你可能会有一些无效状态,因为超类实现错过了初始化某些状态。