【问题标题】:Objective-C Top or bottom super call in overridden method [duplicate]覆盖方法中的Objective-C顶部或底部超级调用[重复]
【发布时间】:2012-08-18 13:38:08
【问题描述】:

在 Objective-C 中,我应该在方法的顶部还是底部调用超级视图覆盖方法?有什么区别?

例如:

在方法的顶部:

 - (void)viewDidLoad {
// HERE
     [super viewDidLoad];

     //Init the table view
     UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 400)];
     aTableView.delegate = self;
     aTableView.dataSource = self;
     aTableView.backgroundColor = [UIColor clearColor];

     self.tableView = aTableView;
     [aTableView release];
 }

或者在方法的底部:

- (void)viewDidLoad {

    //Init the table view
    UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 400)];
    aTableView.delegate = self;
    aTableView.dataSource = self;
    aTableView.backgroundColor = [UIColor clearColor];

    self.tableView = aTableView;
    [aTableView release];

// HERE
    [super viewDidLoad];
}

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    在视图生命周期的情况下,您应该首先在方法中调用它,因为您希望超类在您执行所需操作之前完成设置。

    虽然在 dealloc 的情况下,您应该在方法结束时调用 super,因为您想在超类清理之前进行清理。

    【讨论】:

      【解决方案2】:

      据我了解,您将其放置在哪里取决于您是否需要在超类方法中完成某些事情,然后再执行您需要在方法中执行的操作。因此,如果有任何工作需要先在 supermethod 中完成,则将 super 调用放在顶部。

      【讨论】:

        【解决方案3】:

        要回答这个问题,您首先需要知道为什么您要调用 super。这对于 UIKit 类并不总是很明显,因为您无法轻易弄清楚这些方法在内部做什么。

        忽略这一点,然而,超级调用的位置完全取决于超级类的实现。这里没有黄金法则。有时它应该放在顶部,有时应该放在底部,有时甚至可以在其他行之间调用它。

        顶部

        一个关于何时应该将其放置在顶部的示例是,如果您要覆盖 UIViewControllerloadView 方法以将一些子视图添加到其视图中。在这种情况下,超类实现会加载您应该在其上放置子视图的实际视图,因此将其放在顶部是正确的方法(否则根本不起作用)。

        底部

        将它放在底部的一个很常见的情况是,如果您覆盖 viewWillAppear:UITableViewController。 UITableViewController 在此方法中内部调用[self.tableView deselectRowAtIndexPath:animated:] 以获得当您从另一个视图返回到表视图时行选择淡出的小效果。如果您需要在所选行自动取消选择之前对其执行某些操作,则必须将 super 调用放在底部(或访问所选 indexPath 的行下方)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 2015-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多