我在使用 UINavigationController 和 ARC(自动引用计数)时遇到了一个非常奇怪的问题。 我有一个带有 UIViewController 的 iPad 应用程序,其中包含一个带有一些 subview 的 View 。 它的 View 中有一个 UIScrollView(至少有 5 个 subview )和 2 个简单 View ,一个黑条和一个白条。
每当我在 UINavigationController 堆栈上推送某些东西时,比方说一个 WebView,并且我收到内存警告,UINavigationController 会在它堆栈上的所有当前和以前的 UIViewController 上调用 ViewDidLoad。
现在问题来了,当我从堆栈中弹出 WebView,然后返回带有 ScrollView 的 UIViewController 时,它就不见了! 它完全消失了。
我怀疑自从启用了 ARC 后,-didReceiveMemoryWarning 方法会在幕后释放一些东西。我如何才能强制 ARC 保留这个特定的 ViewController?
有人可以帮我解决这个问题吗?因为此时此刻我真的很烦。
非常感谢!
-B
最佳答案
看起来您在 Web View 中加载的内容非常繁重,导致出现内存警告(或者您正在执行其他导致内存不足的情况)。 UINavigationController 接收到 -didReceiveMemoryWarning
并将它转发给所有卸载 View 的 View Controller (-> viewDidUnload
告诉你释放你不想留在内存中的东西。ARC 确实不包括这个所以你必须消除所有与 View 相关的东西)。
当您返回时,将调用 loadView
和 viewDidLoad
。您可能没有完全恢复您的 View - 特别是您的 ScrollView - 以匹配它们在内存警告之前所处的状态。
请记住,在 iOS 5 中,内存警告出现的频率低于以前的 iOS 版本(操作系统会尝试为您释放尽可能多的内存),但是当您收到内存警告时,这是您存活的最后机会。
关于objective-c - 自动引用计数和 UINavigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8076547/