For a view controller, any outlets that you set in Interface Builder must be released and set to nil in viewDidUnload, and must also be released in dealloc.
(see: When should I release objects in viewDidUnload rather than in dealloc?)
One of the most important reasons for implementing [viewDidUnload] is that UIViewController subclasses commonly also contain owning references to various subviews in the view hierarchy. These properties could have been set through IBOutlets when loading from a nib, or programmatically inside loadView [emphasis added], for instance.
My question is, do we really need to implement viewDidUnload for subviews in the view hierarchy that are created programmatically in loadView (without Interface Builder)?