调用 [super loadView] 会有什么副作用?

4
loadView的文档中,苹果公司指出:

您自定义的此方法实现不应调用super。

因此,我尝试在我的loadView方法中调用[super loadView]。没有发生任何不良反应,也没有警告。我在loadView中使用编程方式创建的视图,而不是从NIB文件中加载。
当我调用[super loadView]时,会发生什么(如果有的话)不良反应?
2个回答

5
调用[super loadView]会导致UIViewController实现中的loadView方法运行。除其他外,如果提供了nibName,这是从NIB加载视图的方法。因此,如果您在自己的子类中设置了所有视图设置并且最后调用了超级,则可能会覆盖所有视图设置。如果您首先调用超级,则不会出现此问题...除非您在-awakeFromNib中有任何代码或其他内容。

基本上,不应该调用super,因为如果您正在以编程方式加载视图,则不需要保留超类中完成的任何工作。最好的情况下,您扔掉了一堆工作。在最坏的情况下,UIViewController可能在其中设置了某些状态,这些状态对视图的起源做出了假设。

您不需要它,所以不要这样做。


如果您想向UIViewController中添加其他子视图,那么在默认视图中调用[super loadView]是否更好?这样可以确保父视图存在,然后再添加自己的子视图(假设未使用IB)。 - bodacious
你是可以这么做的。UIViewController 的默认视图只是一个普通的 UIView,所以它对你并没有太大的帮助,但这是可以实现的。你也可以在 -viewDidLoad 方法中添加它们。 - BJ Homer
是的 - 以前我会在viewDidLoad中添加它们,但现在我更喜欢在load view中这样做,这样视图就可以更早地构建。 - bodacious

1
如果你允许我这样比较的话,就像是“不要在红灯时穿过马路”。
有一个交通信号灯规定了不要穿过马路,因为无论什么原因都可能很危险。当然,可能会在红灯时穿过马路而没有发生任何事情。
API通过声明不应该调用super来设置此规则。就像上面的例子一样,结果是未确定的,并取决于其他因素。当然,可能什么也不会发生。

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