经典的例子是:
- (void)viewDidLoad {
[super viewDidLoad]; // Subclasses sometimes forget this line
// Subclass's implementation goes here
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以确保在编译时UIViewController子类总是[super viewDidLoad]在它们覆盖时调用[UIViewController viewDidLoad]?
nhg*_*rif 25
如果我们讨论的是自定义类,您可以将以下内容添加到超类的方法声明中:
__attribute__((objc_requires_super));
Run Code Online (Sandbox Code Playgroud)
如果你想确保所有的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
Run Code Online (Sandbox Code Playgroud)
@implementation BaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后只是BaseViewController整个项目的子类,而不是子类UIViewController.
所有子类的BaseViewController一个实现viewDidLoad,并且不调用[super viewDidLoad];(这又调用UIViewController的viewDidLoad)将抛出一个警告.
编辑:NS_REQUIRES_SUPER根据斯科特的优秀评论,我编辑了答案以包含一个例子.这两个例子(viewDidLoad和viewWillAppear:)在功能上是等价的.虽然我想NS_REQUIRES_SUPER可能会为你自动完成.我将来可能会开始使用这个宏.
| 归档时间: |
|
| 查看次数: |
1603 次 |
| 最近记录: |