当子类重写方法时,我们如何在编译时确保调用超类的方法实现?

jon*_*ley 14 objective-c ios

经典的例子是:

- (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];(这又调用UIViewControllerviewDidLoad)将抛出一个警告.


编辑:NS_REQUIRES_SUPER根据斯科特的优秀评论,我编辑了答案以包含一个例子.这两个例子(viewDidLoadviewWillAppear:)在功能上是等价的.虽然我想NS_REQUIRES_SUPER可能会为你自动完成.我将来可能会开始使用这个宏.

  • 还有一点容易记住宏:`NS_REQUIRES_SUPER`. (10认同)