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

前端 未结 1 1904
旧时难觅i
旧时难觅i 2020-12-13 21:15

The classic example is:

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

    // Subclass\'s implementation goes here
         


        
相关标签:
1条回答
  • 2020-12-13 21:37

    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.

    0 讨论(0)
提交回复
热议问题