我应该打电话给 [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] 吗?的主要内容,如果未能解决你的问题,请参考以下文章