I have a general question regarding memory management of properties. Currently, I always use properties without any explicit declaration of related ivars. And, for every retained or copied property I’m releasing its retain count both in dealloc and viewDidUnload methods:
-(void)dealloc{
[self.myProperty release];
[self.myOutlet release];
[super dealloc];
}
- (void)viewDidUnload{
[super viewDidUnload];
self.myProperty = nil;
self.myOutlet = nil;
}
Now, I know that only the outlets and properties retained by the main view should be set to nil in viewDidUnload, and the rest properties should be released in dealloc. But hey, why do I have to bother for every property where it must be released – in dealloc or in viewDidUnload? If some property will be released twice it’s OK because it wouldn’t crash the app by sending a message to nil object. Putting release in both places (dealloc and unload) saves time and prevents from bugs later when doing code refactoring and forgetting to change release place. Any critics and shouting on that? 🙂
If you’re using property accessors in -dealloc because you don’t have access to the ivar directly, you should do the same in -dealloc that you do in -viewDidUnload:
The point of using -release in -dealloc is to avoid calling the accessor, which conceivably could have been overridden by a subclass to have side effects that you don’t want in -dealloc, when everything else from the subclass has already been deallocated. But if you’re already calling the accessor in -dealloc, you might as well use the setter to release the ivar and ensure that it’s done right.
The difference between -dealloc and -viewDidUnload is that you’re still working with a complete, fully functional object in -viewDidUnload, whereas the object may already be partially deallocated in -dealloc.