我有以下情况:
UIViewControllerA通过故事板segue将UIViewControllerB推送到导航堆栈;
UIViewControllerB现在在屏幕上,我通过iOS模拟器模拟内存警告。
调用UIViewControllerA.DidReceiveMemoryWarning()以及UIViewControllerA.ViewDidUnload()。
在方法UIViewControllerA.ViewDidUnload()中,我按照建议调用ReleaseDesignerOutlets()。 UIViewControllerA设计器出口现已解除分配并且为空。
我点击了导航栏上的“后退”按钮,它取消了UIViewControllerB,并导致调用UIViewControllerA.ViewDidLoad()。
此时我希望设计器出口初始化但它们仍为空,并且我的应用程序因空指针异常而崩溃。
我是否从根本上错过了什么?我正在使用Monotouch 5.4.0。
EDIT 我发现这个post描述了问题的解决方案与我发现的相同,即不在ViewDidUnload()中释放设计器插座。
更新:它终于崩溃了! (或者至少似乎是)
为了将来参考,看起来大锁定是由于我在ViewDidUnload事件中处理我的UIWebView插座。 UIWebView在xib中定义,而不是作为代码中的子视图添加。
当内存不足时,视图会被卸载并移除UIWebView插座。随后,当应用程序恢复(!?)时,ViewDidLoad事件将再次触发,但它会锁定。 我希望在重新加载视图(即重新加载xib)时恢复UIWebView。
情况不是这样吗? 我认为在ViewDidUnload事件中处理插座是一种好习惯吗?
一旦我注释掉“webView.Dispose(); webView = null;”代码行,它已按预期工作。
多么美好的一天!
EDIT 进一步调试显示,某些设计器出口正在重新分配,如UIImageView和UIScrollView,其他如UITextField和UIBarButtonItem则没有。