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

时间:2009-05-05 12:43:02

标签: iphone viewdidload

在Apple的scrollView示例中,他们不会调用它。我一直以为必须。我为什么要打电话呢?

8 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:29)

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

让我们在这里真实:苹果公司不会打破成千上万的应用程序,包括那些基于他们发布的示例代码的应用程序,通过决定他们当前没有处理的事件突然需要做一些开发人员可能或不想做的事情停止并且至关重要的是,如果您不需要不同的行为,则不要停止该事件。

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

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

答案 2 :(得分:17)

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

答案 3 :(得分:11)

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

这是父方法的样子:

代码:

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

我们希望孩子向父母学习。所以我们用super来说问妈妈会怎么问候,但也有我们自己的小补充。

代码: //从Parent继承

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

所以现在父母问候“你好”,儿童问候“你好,妈妈”。稍后,如果我们改变父母的问候语只返回“嗨”,那么这两个课程都会受到影响,你会有“嗨”和“嗨,妈妈”。

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

答案 4 :(得分:10)

Apple的viewDidLoad文档没有声明你应该调用[super viewDidLoad],所以我会选择Apple的说法。但请注意,对于其他类似方法(如viewDidAppear),您必须调用[super viewDidAppear]。

答案 5 :(得分:9)

您不必调用[super viewDidLoad]

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

因此,如果您需要进行任何初始化,则应覆盖此函数并将代码放在那里。

答案 6 :(得分:5)

注意到如果你不在这些函数中调用super,Xcode 6的静态分析器会发出警告。因此,Apple现在肯定希望我们称之为。

答案 7 :(得分: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
}