问题描述
|
假设我有2个意见。在第一个视图中,我分配了内存来显示许多UI组件,例如UILabel,UIImages等。
假设用户导航到下一个视图(通过UINavigationController)
是否可以在第一个视图中释放分配给显示UI组件的内存,然后在用户返回到第一个视图(在viewFirstLoad或适当的函数中)后再次初始化它们?
在我看来,如果您不执行此操作,则用户在该特定会话中使用您的应用的时间越长,内存将继续增加。
这是不允许的吗?皱眉?不可能?
解决方法
完全正常,实际上,功能是在标准UIViewController中内置的-当不显示控制器时,其视图可能会从内存中释放出来,并且您可以使用控制器的``0''方法释放其所有子视图(例如,通过IBOutlet引用保留的子视图)。
当控制器需要再次显示时,它将再次重新加载其视图。
, 这取决于。通常,经验法则是您应该释放不需要的对象。如果您的视图只是一个视图,那么可以,我将其及其所有子视图发布。如果您的视图中的数据是通过冗长的检索过程(例如,Web服务调用)获得的,则我可能会将数据保留在某个地方,这样我就不必在用户访问时回退并检索数据回到第一个视图。
, 为了澄清一点:Apple建议您在视图的-viewDidLoad方法中显示特定于该视图的数据,例如在标签上设置文本。然后,在-viewDidUnload中,应释放在-viewDidLoad中设置的视图对象(或从零开始)。至关重要的是,实现-viewDidLoad,因为基本的UIViewController代码在假定其子类可以卸载视图之前检查其子类是否实际实现了-viewDidLoad(并因此调用-viewDidUnload)。无法实现-viewDidLoad会导致控制器认为它以后无法重新创建视图,因此不会从内存中卸载视图。我认识的一位开发人员也遇到过同样的问题,因此花了很长时间才找到答案。