Objective-C重写方法中的顶部或底部超级调用
在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]; }
在视图生命周期的情况下,您应该首先在方法中调用它,因为您希望超类在您执行所需操作之前完成设置。
虽然在dealloc的情况下你应该在方法结束时调用super,因为你想在超类清理之前进行清理。
据我所知,它放在哪里取决于你是否需要在你的方法中做你需要做的事情之前在超类方法中完成的事情。 因此,如果在超级方法中首先需要完成任何工作,那么将超级调用置于顶部。
要回答这个问题,你需要知道为什么你首先打电话给超级。 对于UIKit类来说,这并不总是很明显,因为你无法轻易弄清楚这些方法在内部的作用。
但是,忽略这一点,超级调用的位置完全取决于超类实现的作用。 这里有非黄金法则。 有时它应该位于顶部,有时位于底部,有时甚至可以在其他行之间调用它。
最佳
如果要覆盖UIViewController
的loadView
方法以向其视图添加一些子视图,那么它应该放在顶部的示例。 在这种情况下,超类实现会加载您应该放置子视图的实际视图,因此将其放在顶部是正确的方法(或者它根本不起作用)。
底部
将它放在底部的一个很常见的情况是,如果你覆盖了UITableViewController
viewWillAppear:
UITableViewController在此方法内部调用[self.tableView deselectRowAtIndexPath:animated:]
,以便在从另一个视图返回到表视图时淡出选区的效果。 如果在自动取消选择之前需要对所选行执行某些操作,则必须将超级调用放在底部(或访问所选indexPath的行下方)。
- 在iOS8的单个子视图上禁用自动旋转
- XPCErrorDescription“=> <string:0x3623a854> {length = 22,contents =”连接中断“
- UITableView与UIRefreshControl在半透明状态栏下
- 导入CoreServices时出现“CFXMLTreeRef”之前的预期声明说明符或'…'错误?
- 在5X表中最接近一个Int?
- prepareForSegue冻结后更新到iOS9
- Facebook SSO未login(isSessionValid始终返回NO)
- 如何捕获UIPanGestureRecognizer中最初点击的点?
- iOS Keychain偶尔会返回空string