UIViewController视图即使在可见时也被卸载

时间:2011-07-07 21:08:43

标签: iphone ios memory uiview

我有一个视图控制器A以模态方式显示在导航控制器容器中的另一个视图控制器B上。当模拟显示此视图控制器A时模拟内存警告时,我按预期收到didReceiveMemoryWarnings消息,然后我收到一条消息viewDidUnload,从而使我的视图控制器A的视图消失。

这对我来说很惊讶,我不知道如何解决这个问题。为什么要调用viewDidUnload,在进程中释放可见视图?

这是一个堆栈跟踪,以防它有助于查明问题:

  

[UIViewController unloadViewForced:]()

     

0x01458535 in - [UIViewController unloadViewIfReloadable]()

     

0x01463eb8 in - [UINavigationController purgeMemoryForReason:]()

     

0x01457b6d in - [UIViewController didReceiveMemoryWarning]()

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

根据http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

  

内存管理

     

内存是iOS中的关键资源,   和视图控制器提供内置   支持减少记忆力   在关键时刻的足迹。该   UIViewController类提供了一些   自动处理低内存   通过它的条件   didReceiveMemoryWarning方法,其中   释放不需要的内存。在iOS之前   3.0,此方法是释放附加内存的唯一方法   使用您的自定义视图控制器类   但在iOS 3.0及更高版本中   viewDidUnload方法可能更多   适合大多数需求的地方。

     

当发生低内存警告时,   UIViewController类清除它   视图是否知道它可以重新加载或   之后再次重新创建它们。 如果这样   发生了,它也叫   viewDidUnload方法来提供你的代码   有机会放弃对。的所有权   任何与之关联的对象   视图层次结构,包括对象   加载了nib文件,对象   在viewDidLoad方法中创建,   和运行时懒惰创建的对象   并添加到视图层次结构中。   通常,如果您的视图控制器   包含出口(属性或原始   包含IBOutlet的变量   关键字),你应该使用   viewDidUnload方法放弃   这些商店的所有权或任何   其他与视图无关的数据   需要更久。

但是我尝试在iphone模拟器上进行相同的实验,并且没有调用viewDidUnload方法。我认为你的行为可以在真正的低记忆时发生。

答案 1 :(得分:0)

您可以通过选择硬件>>来模拟来自模拟器的低内存警告。模拟记忆警告。

从IOS 6开始,低内存viewDidUnload将不会被调用。因此,您需要通过覆盖didreceivememory方法警告来管理所有内存可以释放的内容。

重要的是要理解,在viewDidUnLoad之后,再次调用viewDidLoad。所以你需要假设viewDidLoad会在ViewController生命周期中多次获得。

假设您没有使用arc,并且分配数组,经过一段时间后由于内存不足而再次调用viewDidLoad,这次再次创建数组会导致内存泄漏。