53

在 Apple 的 scrollView 示例中,他们没有这样称呼。我一直认为这是必须的。我为什么要这样称呼?

4

8 回答 8

49

如果您要覆盖该方法,您仍然应该在超级中调用该方法。即使超类今天没有对它做任何事情,Apple 可能有一天会改变实现,你的代码会神秘地停止工作。如果您真的不需要在该方法中执行任何操作,请将其完全排除在代码之外,超级方法将照常运行,无需您进行任何干预。

于 2009-05-05T13:01:55.160 回答
29

不,您不需要调用 [super viewDidLoad]。编辑:但请阅读以下内容,因为我认为您绝对应该

让我们在这里实事求是:Apple 不会通过决定他们当前未处理的事件突然需要做一些开发人员可能或可能不想停止的事情来破坏数千个应用程序,包括那些基于他们发布的示例代码的应用程序。至关重要的是,如果您不需要不同的行为,则不要停止该事件。

编辑:在观看了 Apple 如何处理兼容性额外一年之后,我现在建议学习和使用正确的模式。虽然我怀疑您的应用程序二进制文件是否会突然停止工作,但很明显 iPhone 会检测到您的二进制文件是针对哪个 SDK 构建的,并基于此修改一些操作系统行为。

Apple 可能有一天会要求在未来的一些 SDK 上遵循特定的模式。在您使用最新的 Xcode + SDK 重建之前,这不会影响您,但是您会在没有任何源代码更改的情况下获得这些中断。学习并遵循模式以确保安全。

于 2009-09-11T02:20:13.160 回答
18

正如 Markus 所说, UIViewController 在其 viewDidLoad 方法中没有做任何事情,所以你不必调用它。然而,这是一个好习惯,以防你改变你的继承结构,突然从 UIViewController 继承的类现在继承了在 viewDidLoad 方法做某事的东西。

于 2009-05-05T12:56:14.690 回答
11

假设您有 2 个班级,一个父母和一个孩子。子继承自父。他们有一个名为 greet 的方法,它返回一个字符串。

下面是父方法的样子:

代码:

-(NSString *)greet {
   return @"Hello";
}

我们希望孩子向父母学习。所以我们用 super 来表达妈妈的问候方式,但也有我们自己的小补充。

代码://从父级继承

-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}

所以现在父母打招呼“你好”,孩子打招呼“你好,妈妈”。稍后,如果我们将父母的问候语更改为只返回“Hi”,那么两个类都会受到影响,您将有“Hi”和“Hi, Mommy”。

super 用于调用超类定义的方法。它用于访问已被子类覆盖的方法,以便类可以将自己的代码包装在其父类实现的方法周围。如果您要进行任何类型的继承,这将非常方便。

于 2014-10-21T11:33:12.977 回答
10

Apple 的 viewDidLoad 文档没有说明您应该调用 [super viewDidLoad],所以我会按照 Apple 的说法。但是请注意,对于 viewDidAppear 等其他类似方法,您必须调用 [super viewDidAppear]。

于 2011-02-14T19:34:13.603 回答
9

您不必调用 [super viewDidLoad]

据我所知,超类(UIViewController)中的 viewDidLoad 只是一个空函数,当使用 nib 文件初始化 ViewController 时会调用它。

所以如果你需要做任何初始化,你应该重写这个函数并将你的代码放在那里。

于 2009-05-05T12:54:44.850 回答
5

刚刚注意到,如果您不在这些函数中调用 super,Xcode 6 的静态分析器会发出警告。所以看起来苹果现在肯定希望我们给它打电话。

于 2014-07-06T01:33:52.957 回答
0

虽然在 xCode 7 Beta/Swift 2 中 super.viewDidLoad 不会编译。该错误表明它仅在 osx 10.10 中可用,并且自动修复会执行此操作

if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}
于 2015-06-20T11:04:31.400 回答