The classic example is:
- (void)viewDidLoad {
[super viewDidLoad]; // Subclasses sometimes forget this line
// Subclass\'s implementation goes here
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.