典型的例子是:
- (void)viewDidLoad { [super viewDidLoad]; // Subclasses sometimes forget this line // Subclass's implementation goes here }
在编译时确保UIViewController子类在覆盖[UIViewController viewDidLoad]时总是调用[super 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.
BaseViewController的任何子类实现viewDidLoad而不调用[super viewDidLoad]; (这又调用UIViewController的viewDidLoad)会发出警告.
编辑:我编辑的答案包括一个NS_REQUIRES_SUPER的例子,根据Scott的优秀评论.两个示例(viewDidLoad和viewWillAppear :)在功能上是等效的.虽然我想像NS_REQUIRES_SUPER可能会为你自动完成.我将来可能会自己开始使用这个宏.