ios – 当子类覆盖一个方法时,如何在编译时确保调用超类的方法实现?

前端之家收集整理的这篇文章主要介绍了ios – 当子类覆盖一个方法时,如何在编译时确保调用超类的方法实现?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
典型的例子是:
- (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可能会为你自动完成.我将来可能会自己开始使用这个宏.

猜你在找的iOS相关文章