When should I call super?

The usual rule of thumb is that when you are overriding a method that does some kind of initialization, you call super first and then do your stuff. And when you override some kind of teardown method, you call super last:

- (void) setupSomething {
    [super setupSomething];
    …
}

- (void) tearDownSomething {
    …
    [super tearDownSomething];
}

The first kind are methods like init…, viewWillAppear, viewDidLoad or setUp. The second are things like dealloc, viewDidUnload, viewWillDisappear or tearDown. This is no hard rule, it just follows from the things the methods do.


Just check the corresponding documentations. For instance, when to call super in overridden methods of UIViewController:

didReceiveMemoryWarning : You can override this method (as needed) to release any additional memory used by your view controller. If you do, be sure to call the super implementation at some point to allow the view controller to release its view. [Means the order is of no importance.]

loadView : Your custom implementation of this method should not call super.

setEditing:animated : This method should invoke super’s implementation before updating its view. [Means the order is of importance.]

viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear: If you override this method, you must call super at some point in your implementation. [Means the order is of no importance.]

dealloc: If you implement this method but are building your application for iOS 2.x, your dealloc method should release each object but should also set the reference to that object to nil before calling super. [Means the order is of importance.]

Did you realize similar rules for super in viewDidLoad and viewDidUnload methods aren't mentioned? Because you don't need to call super in these.


It mostly depends on whether your subclass needs things to happen before the superclass method, or after. Or both, as the case may be.

That's why init methods call the super method first thing, and dealloc methods last thing. In your example, when you are being notified that a view will appear, you might want to let the super do its thing, and then, after that, take care of whatever your subclass view needs to do. But it could conceivably be other way around, or you could call the super method in between your code. Different rules will apply according to your application's needs.