何时在覆盖ios方法时使用super

时间:2016-07-31 22:56:03

标签: ios swift

我的同事有时会在覆盖ios方法时调用super,有时候不会。这似乎主要基于他们的经验。在决定是否打电话给超级时,是否有经验法则?

前:

// Has super
override func awakeFromNib() {
    super.awakeFromNib()
}

// No super
override func drawRect(rect: CGRect) {
}

2 个答案:

答案 0 :(得分:7)

您是否应该调用给定方法的超级实现并不是一个经验法则。这应该根据具体情况确定,具体取决于超类的文档中的建议。该方法的实施,以及您的要求。

为了解释为什么你所包含的两个例子可能就是这样,我们可以查看-[UIView drawRect:]的文档,其中说明:

  

如果直接子类化UIView,则执行此方法   不需要打电话给超级。但是,如果你是一个子类   不同的视图类,你应该在你的某个时刻调用super   实施

以及-[NSObject awakeFromNib]的文档,其中声明:

  

您必须调用awakeFromNib的超级实现来提供父级   对他们进行任何额外初始化的机会进行分类   要求。虽然这个方法的默认实现确实如此   没有,许多UIKit类提供非空实现。

大多数情况下,你可以安全地打电话给方法的超级实现(见下面的评论)。但是,请注意,某些方法要求您调用其超级实现,有些方法不需要,有些方法甚至要求您在覆盖中的特定点调用超级实现。所以请记住,如有疑问,请务必查阅文档。

答案 1 :(得分:0)

向super发送消息是一种调用继承链上的超类定义的方法实现的方法。 super的最常见用法是覆盖方法。调用super将允许父类做一些准备。如果你重写了一个方法,你必须调用super,否则你可能会有一些无效状态,因为超类实现错过了初始化某些状态。