我在-viewDidLoad方法中总是需要调用[super viewDidLoad]吗?

54
在苹果的scrollView示例中,他们没有调用那个。我一直认为那是必须的。无论如何,我为什么要调用它呢?

一个巨大的问题是:在任何实际项目中,你都会继承视图控制器类。在这种情况下,你肯定需要“调用super” - 这是一个典型的头痛问题,如果你或其他人忘记了,那就很恼火。但由于苹果基础,你不必这样做。 - Fattie
8个回答

50

如果您重写了方法,仍应调用父类中的该方法。即使超类今天没有对其进行任何操作,苹果公司可能将来会更改实现,导致您的代码出现神秘故障。如果您确实不需要在该方法中执行任何操作,请完全省略它,并且超类的方法将像往常一样运行,无需您的干预。


29

不,你不需要调用 [super viewDidLoad]。 编辑:但请继续阅读,因为我认为你肯定应该这么做。

让我们现实一点:苹果不会因为决定处理他们目前没有处理的事件突然需要执行某些开发者可能想要停止的操作而破坏成千上万的应用程序,包括那些基于他们发布的示例代码的应用程序,如果您不需要不同的行为,请不要停止事件。

编辑:观察了苹果如何处理兼容性的方式后,我现在建议学习并使用正确的模式。虽然我不认为您的应用程序二进制文件会突然停止工作,但很明显iPhone会检测您的二进制文件是使用哪个SDK构建的,并根据此修改一些操作系统行为。

苹果有一天可能会要求在一些未来的SDK中遵循特定的模式。这不会影响您,直到您使用最新的Xcode + SDK重新构建,但这时您将在没有任何源代码更改的情况下出现问题。学习并遵循模式以确保安全。


18

正如Markus所说,UIViewController在其viewDidLoad方法中并不执行任何操作,因此您不必调用它。不过,养成这个习惯是有好处的,以防您更改继承结构,突然某个原本从UIViewController继承的类现在继承自某个在viewDidLoad方法中执行操作的类。


11

假设你有两个类,一个是父类 Parent ,一个是子类 Child 。Child 继承自 Parent。它们都有一个方法叫做 greet ,返回一个字符串。

下面是 Parent 方法的样子:

代码:

-(NSString *)greet {
   return @"Hello";
}
我们希望孩子从父母那里学习。因此,我们使用“super”来表示像妈妈一样问候,但加入我们自己的小点子。
代码: // 继承自父类
-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}

现在父类打招呼说“你好”,而子类回答说“你好,妈妈”。如果稍后我们将父类的问候更改为只返回“嗨”,那么两个类都会受到影响,你会得到“嗨”和“嗨,妈妈”。

super关键字用于调用由超类定义的方法。它用于访问已被子类覆盖的方法,以便该类可以在其父类实现的方法周围包装自己的代码。如果您正在进行任何形式的继承,那么这非常方便。


10

Apple的viewDidLoad文档并没有说明您需要调用[super viewDidLoad],因此我会遵循Apple的建议。不过,需要注意的是,对于其他类似的方法,如viewDidAppear,您必须调用[super viewDidAppear]。


9

您不需要调用[super viewDidLoad]。

据我所知,父类(UIViewController)中的viewDidLoad只是一个空函数,在ViewController使用nib文件进行初始化时调用。

因此,如果您需要进行任何初始化操作,应该重写此函数并将代码放在其中。


5

刚注意到Xcode 6的静态分析器会在这些函数中未调用super时发出警告。因此,看来苹果现在绝对希望我们调用它。


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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接