Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the timing of calling the method of the super class matter in ObjectiveC?

Does it matter if I call the method of the super class first thing or at the end? For example

-(void)didReceiveMemoryWarning {
   /* do a bunch of stuff */

   [super didReceiveMemoryWarning];
}

versus

-(void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];

   /* do a bunch of stuff */
}

same question for other methods like viewWillAppear, willRotateToInterfaceOrientation etc.

I am looking for meaningful differences, not just stylistic, or philosophical (although those are welcome too).

like image 726
fnCzar Avatar asked Jun 17 '09 05:06

fnCzar


2 Answers

Typical Cocoa convention:

  1. If you are performing setup, call super FIRST
  2. If you are performing teardown, call super LAST

So, initialization, viewDidLoad, etc.. fall under the first case. Memory warnings, viewDidUnload, and dealloc fall under the second case.

You should also design your classes to follow this convention. Any deviations should be specifically noted.

Related SO answer:

`[super viewDidLoad]` convention


To add: The rationale for calling super first during setup, is that you want to make sure everything is in place before you extend functionality. The corollary, is that when you are deallocating, you don't want any superclass ivars your subclass depends on to be dealloced before you have a chance to handle them.

This makes sense in reference to UI updates as well as noted in the comments below.

like image 172
Corey Floyd Avatar answered Nov 14 '22 01:11

Corey Floyd


It depends on functionality, you either want to do something after the super class did its thing or before.

For example if superclass holds some UI elements and you extend it and your class will hold some more UI elements. To get the size to fit your whole object you would probably call super class to calculate the size of its elements and then you add to that size the size of the elements that you added.

It would not make sense otherwise - super class is not aware of your elements so it would overwritten your calculation. Again, this depends on implementation.

There's a specific case where you need to call super method as last thing:

-(void)dealloc
{
    ...
    [super dealloc];
}
like image 28
stefanB Avatar answered Nov 14 '22 01:11

stefanB