Подтвердить что ты не робот

Когда подкласс переопределяет метод, как мы можем гарантировать во время компиляции, что вызывается реализация суперкласса?

Классический пример:

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

    // Subclass implementation goes here
}

Какими способами можно обеспечить во время компиляции, что подклассы UIViewController всегда вызывают [super viewDidLoad], когда они переопределяют [UIViewController viewDidLoad]?

4b9b3361

Ответ 1

Если мы говорим о пользовательских классах, вы можете добавить следующее к объявлению метода суперкласса:

__attribute__((objc_requires_super));

И если вы хотите, чтобы все ваши подклассы UIViewController вызывали метод типа [super viewDidLoad];, вы могли бы подклассифицировать UIViewController примерно так:

@interface BaseViewController : UIViewController

- (void)viewDidLoad __attribute__((objc_requires_super));

// per Scott 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), выдает предупреждение.


EDIT: я отредактировал ответ, чтобы включить пример NS_REQUIRES_SUPER, за один отзыв Скотт. Два примера (viewDidLoad и viewWillAppear:) функционально эквивалентны. Хотя я полагаю, что NS_REQUIRES_SUPER, вероятно, будет автозаполнен для вас. Я, скорее всего, начну использовать этот макрос сам в будущем.