【问题标题】:ViewDidLoad / Unload messages to super?ViewDidLoad / 将消息卸载到超级?
【发布时间】:2010-01-27 16:13:34
【问题描述】:

我注意到来自其他来源的代码,其中作者没有将消息添加到 super 中,如下所示。我通常会同时添加它们,但我只是好奇它们的作用以及我总是添加它们是否正确?

-(void)viewDidLoad {
    //... other code
    [super viewDidLoad];
}

-(void)viewDidUnload {
    //... other code
    [super viewDidUnload];
}

加里

【问题讨论】:

标签: objective-c cocoa-touch


【解决方案1】:

我建议始终将UIViewController 委托消息发送到super(例如viewDidLoad、viewDidAppear)。在某些情况下,如果您直接继承 UIViewController,则没有必要。

一些类,例如UITableViewController,要求子类这样做,如it is documented:“您可以覆盖 loadView 或任何其他超类方法,但如果您确实调用该方法的超类实现,通常作为第一个方法调用。”

对super 的调用为超类提供了处理事件的机会(例如,重新加载表格数据、动画取消选择按钮等)。

不用说,你不需要一个唯一的工作就是调用 super 的显式方法。

【讨论】:

    【解决方案2】:

    这些方法的目的是在它控制的视图完成加载和卸载时通知您的控制器,以防控制器在那些“有趣的时刻”需要完成一些事情。

    您包含的代码基本上什么都不做:它将消息传递给超类实现,而不添加任何自己的处理。但这正是如果完全省略该代码会发生的情况:消息将被传递到定义方法实现的继承链中的最低类。

    【讨论】:

      【解决方案3】:

      您不必使用空实现来覆盖这些方法。当您需要对 ivars 做某事、停止通知观察等时覆盖它。 您的代码没有任何用处

      【讨论】:

        【解决方案4】:

        你应该只在需要执行某种操作时重写一个方法,所以我假设你的代码看起来像这样:

        -(void)viewDidLoad {
            //do things that need to be done when the view is loaded
            [super viewDidLoad];
        }
        

        如果你认为父视图也需要做某事,那么调用 [super viewDidLoad];绝对是有序的。但是,如果您查看 viewDidLoad 的文档,它会说明

        此方法最常用于对从 nib 文件加载的视图执行额外的初始化步骤

        这里的“附加”一词至关重要:它只是一种方便的方法。这与 dealloc 不同,其中文档明确指出,在覆盖 dealloc 时,您必须始终以调用 [super dealloc] 结束。

        如果您的 viewDidLoad 和 viewDidUnload 实现除了调用 super 真的什么都不做,您应该删除它们:除了为编译器做额外的工作之外,它们什么也做不了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-13
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 2018-10-01
          • 2018-12-03
          • 2013-12-26
          • 1970-01-01
          相关资源
          最近更新 更多