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

Joe*_*ick 10 ios swift

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

例如:

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

// No super
override func drawRect(rect: CGRect) {
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*lum 7

对于是否应该调用给定方法的超级实现,实际上没有经验法则.这应该根据具体情况确定,具体取决于超类的实施方法文档中的建议以及您的要求.

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

如果直接子类化UIView,则此方法的实现不需要调用super.但是,如果要子类化其他视图类,则应在实现中的某个时刻调用super.

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

您必须调用awakeFromNib的超级实现,以便为父类提供执行所需的任何其他初始化的机会.虽然此方法的默认实现不执行任何操作,但许多UIKit类提供非空实现.

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

  • 我会以不同的方式回答这个 对于初学者来说,我会说"总是称之为超级实现".如果编译器抱怨未定义该方法,请删除该调用.有时你不需要调用super,因为基类的超级实现什么都不做,但是当你不需要时调用它比在你需要的时候调用它更安全. (5认同)
  • @DuncanC这是一个好点.在有疑问时调用超级可能是一般情况下更安全的默认位置.虽然,(并且我没有想到一个例子),但是可能是某种方法的超级实现具有副作用,这种副作用会改变子类实现中的代码也发生变化的状态.在这种情况下,超级调用在您的覆盖中的位置很重要,并可能导致进一步混淆. (2认同)
  • 我相信标准是首先调用超级版本,然后添加自定义代码.这样,您对该方法所做的任何更改都将在超级实现完成之后应用. (2认同)