我正在完成Objective-c教程,并注意到viewDidLoad中的代码位于超级viewDidLoad下,而不是第一次调用viewDidLoad。
在viewDidLoad和super viewDidLoad下放置代码有什么区别。
我理解对super的调用是对超类的调用,但不确定在这种情况下是什么。
感谢您的任何帮助。
答案 0 :(得分:5)
iOS中的标准做法是在超类完成它需要做的设置(初始化属性,布局等)之后,完成所有子类设置。如果您在开始更改内容之前没有给超类提供处理所有设置的机会,那么您可能会遇到一些奇怪的错误和行为。
答案 1 :(得分:2)
在viewDidLoad和super viewDidLoad下放置代码有什么区别?
执行顺序。您的实现将在超类实现运行后执行。有些实现什么都不做(这个细节应该被抽象出来),但是调用它们也不会有害(应该记录异常)。
如果您正在寻找特定的差异,那么根据类层次结构的不同,这可能会有很大差异。您应该忽略这些实现细节。可以这么说,在执行超类实现之后,超类实现可能还没有准备好处理初始化。
经验法则(应记录例外情况):
请注意实现中前两点的对称性。此外,在运行超类实现后,超类实现可能无法(正确)处理您的请求。
细化super
:您的对象存在于对象层次结构中。超类是您派生的对象。例如:
NSObject >
UIResponder >
UIViewController >
UICollectionViewController
假设UICollectionViewController
已实施-viewDidLoad
。它的实现将调用super
的实现来确保执行类层次结构中的所有实现。这类似于初始化 - 当超类'初始化程序在初始化程序中调用,确保类层次结构中的所有初始化程序都以正确的顺序执行。类似地,-dealloc
以相反的顺序执行(在ARC中,编译器在执行执行后将调用添加到[super dealloc]
)。