Objective-C覆盖方法中的顶部或底部超级调用

时间:2012-08-18 13:38:09

标签: objective-c ios

在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];
}

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

据我所知,你放置它取决于你是否需要在你的方法中做你需要做的事情之前在超类方法中完成的事情。因此,如果有任何工作需要先在超级方法中完成,那么将超级调用置于顶部。

答案 2 :(得分:0)

要回答这个问题,你需要知道为什么你首先打电话给超级。对于UIKit类来说,这并不总是很明显,因为你无法轻易弄清楚方法在内部的作用。

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

如果您要覆盖loadView UIViewController方法以向其视图添加一些子视图,则应将其置于顶部的示例。在这种情况下,超类实现会加载您应该放置子视图的实际视图,因此将其置于顶部是正确的方法(或者它根本不起作用)。

如果您覆盖viewWillAppear:的{​​{1}},则将其置于底部的常见情况就是如此。当您从另一个视图返回到表视图时,UITableViewController在此方法内部调用UITableViewController以获得淡出选择的效果。如果在自动取消选择之前需要对所选行执行某些操作,则必须将超级调用放在底部(或访问所选indexPath的行下方)。