Andreas: Thanks for the information. Now, I should kick myself for picking the name initialize but then maybe I should complain about Apple picking all the best names for methods.
I think I have used the -viewDidLoad method before. phil On Jan 10, 2011, at 9:58 AM, Andreas Grosam wrote: > > On Jan 10, 2011, at 4:17 PM, Phil Hystad wrote: > >> Is there a proper way to initialize a view controller. So far, I have been >> doing this in the application delegate by calling calling an initialize >> method ( i.e. [viewController initialize]) in >> application:didFinishLaunchingWithOptions: method (prior to the view being >> added to the window and the window made visible). > > > *** Important *** > +(void)initialize is a class method which the runtime sends to the class > exactly once just before any of this class' method is invoked, and any of its > super class if +initialized has not yet been invoked. > You rarely need to override +initialize -- and you never call it yourself! > > > > But yes, there is a proper way to do initialization of a view controller > object :) There are lots of examples of how you should do this within the > iOS or Mac OS X documentation. > > Basically, when you load your view from a nib you will override these methods > in order to initialize a view controller: > > -viewDidLoad > This method is called regardless of whether the views were stored in a > nib file or created > programmatically. You usually override it to do additional setup after > the view has been > loaded from a nib. > If you override -viewDidLoad you may want to override -viewDidUnload > accordingly, which is the "counterpart" of -viewDidLoad. > > > -awakeFormNib > To do additional setup after the view has been loaded from a nib. You > often can do all your setup > in viewDidLoad, but sometimes this seems a better place. At the time > the method is invoked, > outlet and action connections are already established. > > > In the cases where you want to create the controller's view yourself > programmatically, you have to use > -loadView. If you do so, you need to create the view hierarchy and assign the > root view to the view property of the controller. > > > You must not call any of these methods yourself! The framework will do this > for you when it is appropriate. > > > An example might be useful: > > The following code assumes you have a nib where you load the view: > > @interface MyViewController : UIViewController { > IBOutlet UIView* mySpecialSubView; > NSArray* myArray; > } > > @property (retain) UIView* mySpecialSubView; > @property (retain) NSArray* myArray; > > @end > > @implementation > @synthesize mySpecialSubView; > @synthesize myArray; > > - (void) viewDidLoad > { > [super viewDidLoad]; // always invoke super! > > // In debug mode, you might check here whether you have established the > links for your outlets in IB: > NSAssert(mySpecialSubView, @"IBOutlet 'mySpecialSubView' is nil"); // > forgot to setup the link in IB? > > // configure my view unless this is already done in IB: > self.view.backgroundColor = [UIColor blackColor]; > > // do other setup, for instance setting up a navigation bar, navigation > item > ... > > // if your view controller needs to initialize other ivars, you might > initialize them here, > // or do "lazy initialization" (see below) > ... > > // Note, that viewDidLoad will be called *everytime* the view gets > reloaded from > // the resource! > // Sometimes, you explicitly DON'T want to perform certain initialization > steps again > // after the view will be reloaded. In this case, use a flag as an ivar > which determines > // whether you have done these initialization steps: > if (!isInitialized) { > [self setupOnce]; > isInitialized = YES; // this is an ivar > } > } > > > You have to override -viewDidUnload in certain cases, e.g.: > > - (void) viewDidUnload { > self.mySpecialSubView = nil; // Outlets shall be set to nil! > > // optionally, you might want to release myArray - just in order to safe > memory. But > // this depends on your needs, and often you explicitly don't want the > array to be > // recreated after a reload of the view. > self.myArray = nil; // optionally > } > > > > // lazy initialization - this overrides the getter method which was otherwise > defined > // by the @synthesize directive: > - (NSArray*) myArray { > if (myArray == nil) { > myArray = [NSArray alloc] init... ]; > } > return myArray; > } > > > // don't forget to release ivars if required: > -(void) dealloc { > [mySpecialSubView release], mySpecialSubView = nil; > [myArray release], myArray = nil; > [super dealloc]; // always invoke super (at the last statement) > } > > > > One thing you should care of: > -viewDidLoad and -awakeFormNib, as well as -loadView may be called more than > once for the lifetime of the view controller. So, be carefully not to > initialize ivars in such a way that you get a memory leak. The following code > snippet would be the wrong way: > > - (void) viewDidLoad { > [super viewDidLoad]; > myArray = [[NSArray alloc] init...]; // possibly memory leak! > } > > The way to do proper initialization would leverage properties: > - (void) viewDidLoad { > [super viewDidLoad]; > NSArray* tmp = [[NSArray alloc] init...]; > self.myArray = tmp; // property retains > [tmp release], tmp = nil; > } > > However, when the view is reloaded (once it has been unloaded for some > reason), the array will be initialized again! This may or may not have > undesired side effects since the array will be released and initialized > again. So, lazy initialization may be the preferred way for certain ivars. > > > > Regards, > > Andreas > > >> >> However, I am not sure if this is the Cocoa canonical way of doing things. >> By the way, this example comes from UIKit but the same question would apply >> to any OS X Cocoa application too. >> >> phil >> phys...@mac.com >> >> _______________________________________________ >> >> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) >> >> Please do not post admin requests or moderator comments to the list. >> Contact the moderators at cocoa-dev-admins(at)lists.apple.com >> >> Help/Unsubscribe/Update your Subscription: >> http://lists.apple.com/mailman/options/cocoa-dev/agrosam%40onlinehome.de >> >> This email sent to agro...@onlinehome.de > > _______________________________________________ > > Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) > > Please do not post admin requests or moderator comments to the list. > Contact the moderators at cocoa-dev-admins(at)lists.apple.com > > Help/Unsubscribe/Update your Subscription: > http://lists.apple.com/mailman/options/cocoa-dev/phystad%40mac.com > > This email sent to phys...@mac.com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com