【问题标题】:Calling awakeFromNib of superclass调用超类的 awakeFromNib
【发布时间】:2016-06-14 06:36:25
【问题描述】:

我安装了 Xcode 8.0 beta (8S128d)。现在我有一些警告信息:

Method possibly missing a [super awakeFromNib] call

在所有awakeFromNib 方法中。 什么情况下需要调用超类的这个方法?

【问题讨论】:

标签: ios objective-c iphone xcode


【解决方案1】:

根据Apple

你必须调用 awakeFromNib 的超级实现给 parent 类有机会执行任何额外的初始化,他们 要求。虽然这个方法的默认实现确实 没什么,很多 UIKit 类都提供了非空的实现。你可以 在您自己的任何时候调用超级实现 awakeFromNib 方法。

在 Xcode 8 之前,对此没有严格的编译器要求,但是 Apple 已使用 Xcode8 对此进行了更改,如果 awakeFromNib 中缺少对 [super awakeFromNib](或 swift 中的 super.awakeFromNib())的调用,编译器会将其视为错误。

所以 Swift 版本看起来像这样:

func awakeFromNib() {
   super.awakeFromNib()

   ... your magical code ...
}

【讨论】:

  • 谢谢!文档链接的最佳答案!
  • 顺序不重要吗?有什么理由要在最后而不是在您自己实施它的开始时做[super awakeFromNib]
  • @micnguyen 值得注意的是,您正在通过覆盖 super 方法来扩展它的行为。所以考虑到这一点, super 需要一个机会首先实现它自己的东西,否则你的子类可能正在做已经完成的事情。我见过开发人员最后调用 super ,但这不是一个好习惯,有点违背了 super 调用的目的。
  • @PostCodeism 是的,我同意。但是苹果文档指出:“您可以在自己的 awakeFromNib 方法中的任何时候调用超级实现。”所以我只是有点好奇他们为什么不一开始就强制执行。
  • @micnguyen 因为不应该强制执行最佳实践,而应该只建议他们:) 此外,有时实际上有充分的理由在最后调用它......但很少。跨度>
【解决方案2】:

您在代码中有效地覆盖了“awakeFromNib”方法。 NSView 或任何你的 superview 也实现了 awakeFromNib - 你应该在你执行任何代码之前在你的实现开始时调用 super 以确保 NSView 可以事先正确设置自己。

- (void)awakeFromNib
{
   [super awakeFromNib];

   ... your code ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多