I have an iOS-App which uses ARC. I don’t use InterfaceBuilder, all UI is generated manually. In that app I have several UIViewControllers with SubViewControllers. Those ViewControllers a tied together from a menu (-ViewController) who pushes them on the stack.
My problem is, that memory doesn’t get freed when switching between the ViewControllers.
Is it wrong to keep references to the SubViewControllers like this?
@property (nonatomic, strong) UIViewController subViewController1;
@property (nonatomic, strong) UIViewController subViewController2;
viewDidUnload never gets called. Has anyone a good example how to build a clean view hierarchy?
This most likely has nothing to do with ARC. viewDidUnload is only called on a view controller when the view property is released / set to nil and this typically only happens if the app receives a memory warning.
Try triggering a memory warning in the simulator and see if that causes your viewDidUnload method to fire. If it does then everything is fine. If not, you are probably over-retaining your views somehow, perhaps by assigning them to other strongly retained properties.
There are exceptions to the view-retaining policy, for example the UINavigationController frees up views in its view controller stack if they aren’t frontmost, but it does that by simply setting the view of its child controllers to nil when they’re covered by another controller’s view.
If you want your views to be released when they aren’t onscreen, either set the controller’s view property to nil in the viewDidDisappear: method, or stop retaining the view controllers when their views aren’t onscreen and just create fresh controller instances each time you need to display them (that way both the controller and view will be released when not in use).