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

时间:2014-01-30 01:10:35

标签: ios objective-c

经典的例子是:

- (void)viewDidLoad {
    [super viewDidLoad]; // Subclasses sometimes forget this line

    // Subclass's implementation goes here
}

有哪些方法可以确保在编译时UIViewController子类在覆盖[super viewDidLoad]时始终调用[UIViewController viewDidLoad]

1 个答案:

答案 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_SUPERviewDidLoad)在功能上是等效的。虽然我想viewWillAppear:可能会为你自动完成。我将来可能会开始使用这个宏。