当一个子类重写一个方法时,我们如何确保在编译时超类的方法实现被调用?
典型的例子是:
- (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];
(反过来调用UIViewController
的viewDidLoad
)会发出警告。
编辑:我已经编辑了答案,包括一个NS_REQUIRES_SUPER
的例子,每个斯科特的优秀评论。 这两个例子( viewDidLoad
和viewWillAppear:
在function上是等价的。 虽然我想NS_REQUIRES_SUPER
可能会为你自动完成。 我将来可能会开始使用这个macros。