经典的例子是:
- (void)viewDidLoad {
[super viewDidLoad]; // Subclasses sometimes forget this line
// Subclass's implementation goes here
}
有哪些方法可以确保在编译时UIViewController
子类在覆盖[super viewDidLoad]
时始终调用[UIViewController viewDidLoad]
?
答案 0 :(得分:25)
如果我们讨论自定义类,您可以将以下内容添加到超类的方法声明中:
__attribute__((objc_requires_super));
如果您想确保所有UIViewController
子类都调用[super viewDidLoad];
之类的方法,您可以将UIViewController
子类化为这样的内容:
@interface BaseViewController : UIViewController
- (void)viewDidLoad __attribute__((objc_requires_super));
// per Scott's excellent comment:
- (void)viewWillAppear:(BOOL)animated NS_REQUIRES_SUPER;
@end
@implementation BaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
@end
然后只在项目中继承BaseViewController
,而不是继承UIViewController
。
BaseViewController
的任何子类实现viewDidLoad
而不调用[super viewDidLoad];
(后者调用UIViewController
的{{1}})将发出警告。
编辑:根据斯科特的优秀评论,我编辑了答案以包含viewDidLoad
的示例。两个示例(NS_REQUIRES_SUPER
和viewDidLoad
)在功能上是等效的。虽然我想viewWillAppear:
可能会为你自动完成。我将来可能会开始使用这个宏。