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

典型的例子是:

- (void)viewDidLoad { [super viewDidLoad]; // Subclasses sometimes forget this line // Subclass's implementation goes here } 

有什么办法可以确保在编译时UIViewController子类总是调用[super viewDidLoad]当他们重写[UIViewController viewDidLoad]

如果我们正在讨论自定义类,可以将以下内容添加到您的超类的方法声明中:

 __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

实现viewDidLoad并且不调用[super viewDidLoad];任何BaseViewController子类[super viewDidLoad]; (反过来调用UIViewControllerviewDidLoad )会发出警告。


编辑:我已经编辑了答案,包括一个NS_REQUIRES_SUPER的例子,每个斯科特的优秀评论。 这两个例子( viewDidLoadviewWillAppear:在function上是等价的。 虽然我想NS_REQUIRES_SUPER可能会为你自动完成。 我将来可能会开始使用这个macros。