在UIViewController中加载和卸载数据

时间:2012-02-23 21:40:51

标签: objective-c ios memory-management memory-leaks

我需要在UIViewController中加载一些数据,以便在iPhone模态视图中显示UIPickerView小部件。

我做了一些研究,并在SO中发现了这个answer。我继续在initWithNibName:bundle:中实现我的数据读取代码,并在dealloc中实现数据卸载。但是,在重复显示模态视图时,Instruments一直告诉我存在内存泄漏,并且在调试期间我注意到每次显示视图时都调用了initWithNibName:bundle:,但是在正常执行时从未调用dealloc(尽管它是由根据Apple UIViewController Class Reference文档的低内存条件,同样适用于viewDidUnload)。

我最终在viewDidLoad:方法中加载数据,并在viewDidDisappear:中发布,小部件显示数据并且没有泄漏。但是,我想知道是否有任何关于此的良好做法,因为Apple的文档中的一条评论提到了这一点:

  

您不应使用此方法(即viewDidUnload)来释放用户数据或任何其他无法轻松重新创建的信息。

我认为正确的方法是在viewDidLoad中加载数据并在viewDidUnload中释放对它的所有引用,但实际上除非出现内存不足的情况,否则不调用后一种方法,因此每次显示视图时,数据都是再次加载,旧数据的引用丢失,导致内存泄漏。

感谢您的评论。

1 个答案:

答案 0 :(得分:1)

如果在每次显示视图时调用viewDidLoad,都会发生错误。应该调用viewDidAppear,但只应在第一次需要视图时调用viewDidLoad,并且如果需要视图并调用viewDidUnload