I believe viewDidUnload
isn't normally called when a view disappears from view. The reason for this is because dealloc
will typically take care of all the memory dumping, so it doesn't need to call viewDidUnload
first.
I think an example would help identify when viewDidUnload
is called. Let's say you have a UINavigationController
and you've pushed on a new view. This new view is very heavy on memory usage, so the app tries to shore up some resources. It does this by seeing if any Views are loaded that aren't currently on the screen. If so, it calls viewDidUnload
where ideally you remove things that you built in loadView or viewDidLoad
. Then when you go back to that view, it calls loadView or viewDidLoad
again to re-build what it dumped off in viewDidUnload
.
But if it doesn't need to free up memory to show your detail view, it won't call it in the normal processing of it. That's why viewWillDisappear
is called (and dealloc
) but never viewDidUnload
.
From Apple's documentation:
When a low-memory warning occurs, the UIViewController class purges
its views if it knows it can reload or recreate them again later. If
this happens, it also calls the viewDidUnload method to give your code
a chance to relinquish ownership of any objects that are associated
with your view hierarchy, including objects loaded with the nib file,
objects created in your viewDidLoad method, and objects created lazily
at runtime and added to the view hierarchy. Typically, if your view
controller contains outlets (properties or raw variables that contain
the IBOutlet keyword), you should use the viewDidUnload method to
relinquish ownership of those outlets or any other view-related data
that you no longer need.
UIViewController Class Reference