1

试图追查某些设备上崩溃的原因。我注意到我的视图控制器正在接收didReceiveMemoryWarning,但不是viewDidUnload。而根据苹果:iOS - 未调用viewDidUnload,但调用了didReceiveMemoryWarning

你不会用didReceiveMemoryWarning释放的引用,查看对象,你可以用它来释放你没有在你的viewDidUnload方法已经释放任何视图相关的数据结构。 (视图对象本身应始终在viewDidUnload方法被释放。)

所以,

答:为什么viewDidUnload不叫?如果它从未被调用过,我不能在这里删除我的视图对象。 B:如果我不应该在didReceiveMemoryWarning中删除我的视图对象,那么我会在哪里做到这一点? C:使用ARC,我是否仍然需要删除视图对象,将数组设置为零等?

+0

我觉得这不太可能你的崩溃是因没有除去意见和这样造成的。你应该检查使用仪器内存不足导致崩溃。 – MaxGabriel

+0

@MaxGabriel我内存不足。但我的一个视图控制器有很多图像。所以,当我收到警告时,我可以释放内存并将其移除。 – soleil

回答

0

didReceiveMemoryWarning特别不针对一个视图的卸载,而是用于视图控制器,其可以很容易地被重新创建(即UIIamges等)释放对象。除非可以根据需要轻松重新创建,否则不应在视图中释放对象。

1

viewDidUnload已在iOS6中弃用。如果您认为有必要,您可以“移除”didReceiveMemoryWarning中的视图,但这是由您决定的。

此主题可能也有帮助。

viewDidUnload no longer called in ios6

+0

圣洁的废话,我不知道这一点。这不会让任何清理viewDidUnload中的视图的应用程序在获取内存警告时非常容易崩溃吗? – soleil

+0

如果视图没有被卸载,视图控制器如何知道重新加载视图?我可以删除didReceiveMemoryWarning中的图像视图,但现在当我回到视图控制器时,它们已经消失 – soleil

+0

我不是百分之百,但我的理解是,如果您设置了'self.view = nil',则在下次访问view,'viewDidLoad'将被调用。顺便说一句,如果你将子视图建立为'IBOutlet',最好的做法似乎是将它们声明为'weak'属性,这样当你设置'self.view = nil'时,所有的子视图也会被释放。 – barley

2

如前所述viewDidUnload:其他被弃用的iOS 6,但随着更多的信息,你应该知道,这是很少有必要卸载UIView,因为iOS 6的是做它的神奇的thingie在后台-IT正在破坏该视图的背景CALayer的位图层(这是迄今为止UIView的最大“部分”)。如果再次需要视图,iOS会调用drawRect:,您可以在其中构建视图,并且一切都会正常。

欲了解更多信息,请阅读乔康威的这篇大文章:ViewController lifecycle in iOS 6

相关问题