viewDidLoad vs调用超级viewDidLoad

时间:2014-11-25 17:28:18

标签: ios objective-c

我正在完成Objective-c教程,并注意到viewDidLoad中的代码位于超级viewDidLoad下,而不是第一次调用viewDidLoad。

在viewDidLoad和super viewDidLoad下放置代码有什么区别。

我理解对super的调用是对超类的调用,但不确定在这种情况下是什么。

感谢您的任何帮助。

2 个答案:

答案 0 :(得分:5)

iOS中的标准做法是在超类完成它需要做的设置(初始化属性,布局等)之后,完成所有子类设置。如果您在开始更改内容之前没有给超类提供处理所有设置的机会,那么您可能会遇到一些奇怪的错误和行为。

答案 1 :(得分:2)

  

在viewDidLoad和super viewDidLoad下放置代码有什么区别?

执行顺序。您的实现将在超类实现运行后执行。有些实现什么都不做(这个细节应该被抽象出来),但是调用它们也不会有害(应该记录异常)。

如果您正在寻找特定的差异,那么根据类层次结构的不同,这可能会有很大差异。您应该忽略这些实现细节。可以这么说,在执行超类实现之后,超类实现可能还没有准备好处理初始化。

经验法则(应记录例外情况):

  • 初始化/设置时,运行超类'先实现。
  • 拆除/清理时,请运行超级班级'最后实施。
  • 对于其他类别,您通常希望运行超类'先实现。

请注意实现中前两点的对称性。此外,在运行超类实现后,超类实现可能无法(正确)处理您的请求。

细化super:您的对象存在于对象层次结构中。超类是您派生的对象。例如:

NSObject >
UIResponder >
UIViewController >
UICollectionViewController

假设UICollectionViewController已实施-viewDidLoad。它的实现将调用super的实现来确保执行类层次结构中的所有实现。这类似于初始化 - 当超类'初始化程序在初始化程序中调用,确保类层次结构中的所有初始化程序都以正确的顺序执行。类似地,-dealloc以相反的顺序执行(在ARC中,编译器在执行执行后将调用添加到[super dealloc])。