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]
?
The ability of a subclass to override a method allows a class to inherit from a superclass whose behavior is "close enough" and then to modify behavior as needed. The overriding method has the same name, number and type of parameters, and return type as the method that it overrides.
When an overridden method is called from within a subclass, it will always refer to the version of that method defined by the subclass. The version of the method defined by the superclass will be hidden.
In Java, method overriding occurs when a subclass (child class) has the same method as the parent class. In other words, method overriding occurs when a subclass provides a particular implementation of a method declared by one of its parent classes.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With