When a subclass overrides a method, how can we ensure at compile time that the superclass's method implementation is called?

ios, objective-c

Solution

If we're talking about custom classes, you can add the following to your superclass's method declaration:

__attribute__((objc_requires_super));

And if you want to ensure that all of your `UIViewController` subclasses call a method like `[super viewDidLoad];`, you could subclass `UIViewController` something like this:

@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

And then just subclass `BaseViewController` throughout your project, rather than subclassing `UIViewController`.

Any subclass of `BaseViewController` which implements `viewDidLoad` and does not call `[super viewDidLoad];` (which in turn calls `UIViewController`'s `viewDidLoad`) will throw a warning.

EDIT: I've edited the answer to include an example of `NS_REQUIRES_SUPER`, per Scott's excellent comment. The two examples (`viewDidLoad` and `viewWillAppear:`) are functionally equivalent. Though I imagine `NS_REQUIRES_SUPER` probably will autocomplete for you. I'll likely begin using this macro myself in the future.

Problem

The classic example is: ``` - (void)viewDidLoad { [super viewDidLoad]; // Subclasses sometimes forget this line // Subclass's implementation goes here } ``` What are some ways to ensure at compile time that `UIViewController` subclasses always call `[super viewDidLoad]` when they override `[UIViewController viewDidLoad]`?

Original source