我需要在UIViewController
中加载一些数据,以便在iPhone模态视图中显示UIPickerView
小部件。
我做了一些研究,并在SO中发现了这个answer。我继续在initWithNibName:bundle:
中实现我的数据读取代码,并在dealloc
中实现数据卸载。但是,在重复显示模态视图时,Instruments一直告诉我存在内存泄漏,并且在调试期间我注意到每次显示视图时都调用了initWithNibName:bundle:
,但是在正常执行时从未调用dealloc(尽管它是由根据Apple UIViewController Class Reference文档的低内存条件,同样适用于viewDidUnload
)。
我最终在viewDidLoad:
方法中加载数据,并在viewDidDisappear:
中发布,小部件显示数据并且没有泄漏。但是,我想知道是否有任何关于此的良好做法,因为Apple的文档中的一条评论提到了这一点:
您不应使用此方法(即viewDidUnload)来释放用户数据或任何其他无法轻松重新创建的信息。
我认为正确的方法是在viewDidLoad中加载数据并在viewDidUnload中释放对它的所有引用,但实际上除非出现内存不足的情况,否则不调用后一种方法,因此每次显示视图时,数据都是再次加载,旧数据的引用丢失,导致内存泄漏。
感谢您的评论。
答案 0 :(得分:1)
如果在每次显示视图时调用viewDidLoad
,都会发生错误。应该调用viewDidAppear
,但只应在第一次需要视图时调用viewDidLoad
,并且如果需要视图并调用viewDidUnload
。