In new iOS 6, viewDidUnload
is deprecated and we have been instructed to use didReceiveMemoryWarning
instead, to manage objects in UIViewController instances and subclasses. Is it equally effective to assign nils to UIView kinds inside didReceiveMemoryWarning
like the way it has been done inside viewDidUnload
?
I am asking this because these two methods seems to be working differently. It seems like didReceiveMemoryWarning
doesn't guarantee viewDidLoad
to be called again to re-instantiate any necessary UIViews.
I suspect with iOS 6, memory management is done without requiring to manually deallocate UIView. Please help me to know what I have missed in understanding the lifecycle of UIViewController.
My preferred method is now the following:
Note that the test
self.isViewLoaded
is essential, as otherwise accessing the view causes it to load - even the WWDC videos tend to miss that.If your other references to subviews are weak references, you don't have to nil them out here, otherwise you want to set them to nil, too.
You should get rid of
viewDidUnload
completely, and every code there should move to appropriate places. It wasn't guaranteed to be called prior to iOS 6 before anyway.The answer by Eiko is not correct, and we should NOT set
self.view
tonil
when receiving low memory warning. Doing so is useless and may be harmful.iOS 6 will automatically freeing bitmaps of views which is not currently displayed, See http://thejoeconwayblog.wordpress.com/2012/10/04/view-controller-lifecycle-in-ios-6/ for details.
In the iOS reference for
viewDidUnload:
, it states that this is deprecated for iOS 6 becauseIt doesn't say anything about placing this code in
didReceiveMemoryWarning:
. Since views are no longer purged under low memory conditions, you never have to worry about cleaning up your views in either method.