在UIViewController中加载和卸载数据



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

我做了一些研究,在SO中找到了这个答案。我在initWithNibName:bundle:中实现了我的数据读取代码,在dealloc中实现了数据卸载。然而,Instruments一直告诉我,在重复显示模式视图时存在内存泄漏,在调试过程中,我注意到每次显示视图时都会调用initWithNibName:bundle:,但在正常执行下从未调用dealloc(尽管根据Apple的UIViewController类参考文档,它是由低内存条件触发的,viewDidUnload也是如此)。

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

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

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

谢谢你的评论。

如果每次显示视图时都调用viewDidLoad,则会发生一些不好的情况。viewDidAppear应该被调用,但viewDidLoad应该只在第一次需要视图时以及如果需要视图并且viewDidUnload被调用时被调用。

最新更新