iPhone:为什么不在viewWillDisappear中解除分配,并在viewWillAppear中分配?

时间:2011-07-05 13:57:18

标签: iphone objective-c

在我看来,内存使用是iPhone编程时需要注意的主要事项之一。常见的模式是在viewWillLoad中创建子视图,标签等,并在viewWillUnload中将它们设置为nil。我理解这背后的原因。

但是为什么不在viewWillDisappear而不是viewWillUnload中将所有内容(除了花费很长时间构建的内容)设置为nil?

当您的视图消失时,您不再需要为UI项目分配内存。当您的视图再次出现时,您可以再次创建UI项目。

我知道你可以做我刚刚描述的事情......我知道这完全有可能,但我的问题是为什么这不是常见模式?

分配新内存有隐藏的主要成本吗?它会引起奇怪的行为吗?这根本没用吗?

2 个答案:

答案 0 :(得分:1)

  1. 常见模式实际上是viewDidLoadviewDidUnload
  2. 这种模式的一个很好的理由是性能。当使用UINavigationController时,通常会调用将出现和消失的方法,并且仅仅因为视图将消失它并不意味着它不会很快再次出现。因此,如果这就是为什么卸载所有内容,如果内存不是问题,并且每次都必须重新创建用户状态(获取数据,设置开关,分段控件等)。虽然内存在设备上很重要,性能也是如此,但没有人愿意使用“滞后”的UI。正确使用-(void)viewDidLoad-(void)viewDidUnload- (void)didReceiveMemoryWarning可以最大限度地提高内存和性能。

答案 1 :(得分:0)

好吧,如果您只是显示一个modelviewcontroller,那么它背后的视图将会卸载,这将使该视图返回缓慢。这就是viewDidLoadviewDidUnload不用于viewWillAppearviewWillDisappear(或viewDidDisappear)的原因。

分配对象很慢,所以你应该只在需要时才这样做。

viewDidLoadviewDidUnload会自动调用不再可见的视图,系统需要更多内存。 例如,当系统调用applicationDidReceiveMemoryWarning时,会发生这种情况,然后UINavigationController将卸载堆栈中的所有视图,但不会卸载viewControllers。这样可以很容易地返回到卸载时视图所处的任何状态。