我总是必须在 -viewDidLoad 方法中调用 [super viewDidLoad] 吗?
Posted
技术标签:
【中文标题】我总是必须在 -viewDidLoad 方法中调用 [super viewDidLoad] 吗?【英文标题】:Do I always have to call [super viewDidLoad] in the -viewDidLoad method? 【发布时间】:2009-05-05 12:43:02 【问题描述】:在 Apple 的 scrollView 示例中,他们没有这样称呼。我一直认为这是必须。我为什么要这样称呼它?
【问题讨论】:
一个大问题是:在任何实际项目中,您都会继承视图控制器类。在这种情况下,您当然必须“调用 super” - 这是您或其他人忘记的项目的典型头痛。当这种情况发生时,真令人气愤。但由于 Apple 的基础,您不必这样做。 【参考方案1】:如果您要覆盖该方法,则仍应在 super 中调用该方法。即使超类今天没有对它做任何事情,Apple 可能有一天会改变实现,你的代码会神秘地停止工作。如果您真的不需要在该方法中执行任何操作,请将其完全排除在您的代码之外,超级方法将照常运行,而无需您进行任何干预。
【讨论】:
【参考方案2】:不,您不需要 调用 [super viewDidLoad]。 编辑:但请阅读下文,因为我认为您绝对应该应该。
让我们现实一点:Apple 不会通过决定他们当前未处理的事件突然需要做一些开发人员可能或可能不想做的事情来破坏数以千计的应用程序,包括那些基于其发布的示例代码的应用程序停止,如果您不需要不同的行为,请不要停止事件,这一点至关重要。
编辑:在观察了 Apple 如何处理兼容性额外一年之后,我现在建议学习和使用正确的模式。虽然我怀疑您的应用程序二进制文件是否会突然停止工作,但很明显 iPhone 会检测到您的二进制文件是针对哪个 SDK 构建的,并据此修改一些操作系统行为。
Apple 可能有一天会要求在未来的某些 SDK 上遵循特定模式。在您使用最新的 Xcode + SDK 重建之前,这不会影响您,但是您会在没有任何源代码更改的情况下获得这些中断。学习并遵循模式以确保安全。
【讨论】:
【参考方案3】:正如 Markus 所说,UIViewController 在其 viewDidLoad 方法中不做任何事情,因此您不必调用它。但是,养成一个好习惯,以防您更改继承结构并且突然从 UIViewController 继承的类现在继承自 viewDidLoad 方法中确实做某事的某事。
【讨论】:
【参考方案4】:假设您有 2 个班级,一个父母和一个孩子。子继承自父。他们有一个名为 greet 的方法,它返回一个字符串。
下面是父方法的样子:
代码:
-(NSString *)greet
return @"Hello";
我们希望孩子向父母学习。所以我们用 super 来表达妈妈会如何打招呼,但也有我们自己的小补充。
代码: // 从父类继承
-(NSString *)greet
NSString *parentGreeting = [super greet];
return [parentGreeting stringByAppendingString:@", Mommy"]
所以现在父母打招呼“你好”,孩子打招呼“你好,妈妈”。稍后,如果我们将父母的问候语更改为只返回“Hi”,那么两个类都会受到影响,您将拥有“Hi”和“Hi, Mommy”。
super 用于调用超类定义的方法。它用于访问已被子类覆盖的方法,以便类可以将自己的代码包装在其父类实现的方法周围。如果您要进行任何类型的继承,这将非常方便。
【讨论】:
【参考方案5】:Apple 的 viewDidLoad 文档没有说明您应该调用 [super viewDidLoad],所以我会按照 Apple 的说法。但是请注意,对于 viewDidAppear 等其他类似方法,您必须调用 [super viewDidAppear]。
【讨论】:
【参考方案6】:你不必调用 [super viewDidLoad]
据我所知,超类 (UIViewController) 中的 viewDidLoad 只是一个空函数,当使用 nib 文件初始化 ViewController 时会调用该函数。
所以如果你需要做任何初始化,你应该重写这个函数并将你的代码放在那里。
【讨论】:
【参考方案7】:刚刚注意到,如果您不在这些函数中调用 super,Xcode 6 的静态分析器会发出警告。所以看来苹果现在肯定希望我们给它打电话。
【讨论】:
【参考方案8】:虽然在 xCode 7 Beta/Swift 2 中 super.viewDidLoad 不会编译。该错误说它仅在 osx 10.10 中可用,并且自动修复会这样做
if #available(OSX 10.10, *)
super.viewDidLoad()
else
// Fallback on earlier versions
// My code
【讨论】:
以上是关于我总是必须在 -viewDidLoad 方法中调用 [super viewDidLoad] 吗?的主要内容,如果未能解决你的问题,请参考以下文章
在Codeigniter中调用未定义的方法CI_DB_odbc_driver :: limit()