我应该打电话给 [super awakeFromNib] 吗?

Posted

技术标签:

【中文标题】我应该打电话给 [super awakeFromNib] 吗?【英文标题】:Should I call [super awakeFromNib]? 【发布时间】:2010-10-21 16:23:41 【问题描述】:

如果我实现自己的awakeFromNib 版本,我应该在方法结束时调用[super awakeFromNib] 吗?

【问题讨论】:

您应该将接受的答案切换到 Matt DiPasquale 的;他的答案是正确的。 【参考方案1】:

awakeFromNib for UIKit (ios):

您必须调用 awakeFromNib 的超级实现,以使父类有机会执行它们需要的任何其他初始化。虽然这个方法的默认实现什么都不做,但是很多 UIKit 类都提供了非空的实现。您可以在自己的 awakeFromNib 方法中随时调用超级实现。

awakeFromNib for AppKit (Mac):

(不再适用,如果使用 OS X 10.6 或更高版本)

只有当你确定你的超类提供了一个实现时,你才应该调用 awakeFromNib 的超实现。因为 Application Kit 没有提供 awakeFromNib 方法的默认实现,所以如果父类没有实现,调用 super 会导致异常。直接父类为 NSObject 或 NSView 的类不需要调用超级实现。对于任何其他类,您可以使用 NSObject 的 instanceRespondToSelector: 类方法来确定父类是否响应 awakeFromNib 并调用该方法。

【讨论】:

我猜它只是在发行说明中,而不是在文档中,NSObject 从 OS X 10.6 开始实现 -awakeFromNib @MikeAbdullah 你是对的,OS X 文档还没有提到这一点。我已经提交了 radar://22585685 以更新文档,并已将 NS_REQUIRES_SUPER 添加到 UIKit 和 AppKit 的声明中。 :-)【参考方案2】:

The documentation 完美地涵盖了这一点。

如果您想询问 Cocoa Touch,您就没有那么幸运了:UIKit 文档在我能找到的任何地方都没有明确回答这个问题。我能建议的最佳做法是遵循与 Cocoa 相同的规则。

【讨论】:

在这篇***.com/questions/1588813/…的帖子中,最后一个答案确实指向了这个信息(developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…的第4节) KevinDTimm:我在该文档页面上没有看到任何地方指定是否应该发送[super awakeFromNib]。大量关于 Cocoa 和 Cocoa Touch 的 awakeFromNib 讨论,但没有关于特定方面的讨论。 我只是在评论 cocoa 和 cocoa touch 是否响应相同的规则的问题 - 似乎它们没有。 没错,但我能看到的唯一区别是 Cocoa Touch 只将awakeFromNib 发送给刚刚取消归档的对象,而 Cocoa 也将它发送给文件的所有者。【参考方案3】:

是的,你应该这样做。

我实现了拖放并且一切正常,直到我添加了我自己的 awakeFromNib 然后拖放函数 whichTypeToProcess 从未被调用。

直到我添加了 [super awakeFromNib];作为我自己的 awakeFromNib 中的最后一条语句,拖放函数 whichTypeToProcess 被再次调用并且拖放再次开始工作。

仅供参考 - 这是在 MacOSX 应用程序中。

【讨论】:

以上是关于我应该打电话给 [super awakeFromNib] 吗?的主要内容,如果未能解决你的问题,请参考以下文章

方法 [load] 是不是需要调用 [super load]

视图应该直接打电话给商店吗?

AwakeFromNib 没有出口

我啥时候打电话给我的班级控制器、经理或服务?

我应该 .npmignore 我的测试吗?

如何正确处理 UnsafeMutablePointer