I’m still learning iOS development and have been working with various tutorials and books. Some pre-ARC, some with ARC.
In some cases, we’re taught to release all of the properties and subviews of a ViewController on viewDidUnload but in some cases I’ve been told this is no longer required.
Can someone give a definitive answer? In iOS 5+, does one have to do the whole:
-(void)viewDidUnload
{
[super viewDidUnload];
self.photoViewCell = nil;
self.photoImageView = nil;
self.firstNameTextField = nil;
self.lastNameTextField = nil;
}
… or not? If so, is this only for properties that are descendants of UIView or is it for all properties of the ViewController?
Thanks
So each view has a number of owners. When that “owner count” (usually referred to as the retainCount) reaches 0, that object gets destroyed.
In iOS 5, we now have weak references, which essentially means “don’t own this object”.
Before iOS 5, in our header files, you’d see
And this label was added to the XIB file’s view. myLabel has 2 owners in this case: it’s superview (the view in the XIB file) and the view controller (by having the IBOutlet). When viewDidUnload get’s called, the view controller’s view has been released, and therefore it’s ownership of myLabel is gone. So myLabel at this point only has 1 owner, the view controller. So we needed to release it in viewDidLoad to make sure it didn’t have any owners and so was destroyed.
With iOS 5, you will often seen this instead
This is saying that we don’t want the view controller to be an owner of myLabel. So the only owner is the view controller’s view. So when viewDidUnload get’s called, the view controller’s view has already been released, and so its ownership of myLabel has also been released. In this case, myLabel now has no owners and its memory is released. There is no need for the self.myLabel = nil; there.
So with iOS 5, the recommendation is to make all of your IBOutlets a weak reference. With this, you don’t even need to implement viewDidUnload, as all the memory has been taken care of for you.
But even if you are using iOS 5, if your IBOutlets aren’t weak references, you’ll need that code in viewDidUnload.