In developing my current app, I ran into some issues that I eventually traced back to a low memory warning. Part of the low memory is coming from my (liberal) use of UIWebViews, which are apparently consuming a lot of memory.
I didn’t think this would be an issue, since a view that isn’t currently visible should just vanish when the low memory warning is thrown, unfortunately it turns out that anything connected to the UITabBarController remains in the heirarchy and doesn’t release. By manually releasing (and then recreating in viewWillAppear) the views, I make things work decently. But it doesn’t completely solve the memory warning issue.
So what I need to do is manually release the view — and the large amount of memory that winds up connected to it — and then restore it. Since I don’t want to build it programmatically (that’s what IB is for!), I need to somehow reload it from storyboard.
Or, alternatively, I’m being an idiot and there’s something really obvious to make my life easy.
After more experimentation, it turns out that on the one hand, my understanding of view life cycles was slightly flawed, and on the other my experiments were tainted by having accidentally let zombie objects on.
Views will, in fact, unload their contents in a low memory condition and reload them later — that’s part of what ‘viewDidLoad’ and ‘viewDidUnload’ are designed for! Putting init code in them, as some tutorials I read did, was a major error. That init code should go in the designated initializer — even if that can be annoying to figure out which initializer is designated.