Which should I use, -awakeFromNib or -viewDidLoad?
awakeFromNib
is called when the controller itself is unarchived from a nib. viewDidLoad
is called when the view is created/unarchived. This distinction is especially important when the controller's view is stored in a separate nib file.
I'll try to answer by giving an example:
If define customCell
class and customCell.xib
file, and then load the cell by using- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
, awakeFromNib gets called when the objects in the xib are unarchived.
If you define a customViewController
, then when the customViewController
is created using - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
. viewDidLoad will get called when it's loaded into view hierarchy.
Some related confusing methods:
(void)loadView; This is where subclasses should create their custom view hierarchy if they aren't using a nib. If you don't specify a nib name, then loadView will attempt to load a nib whose name is the same as your view controller's class. If no such nib exists, then you must either call -setView: before -view is invoked, or override the -loadView method to set up your views programatically. -loadView should never be called directly.
(void)viewDidLoad: Called after the view has been loaded. For viewControllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set.
Yes, it's correct. You shouldn't really rely on awakeFromNib
to do that kind of tasks.
awakeFromNib
is similar to an event that's called after deserialization in .NET. viewDidLoad
is similar to Load
event in .NET.
If you are familiar with the concepts from .NET, this should be enough, I think.
Also important is that the awakeFromNib
function will never be called after recovering from memory warning. But, the viewDidLoad
function will be called.