2012-02-23 99 views
1

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

我做了一些研究,发现在SO中有这个answer。我继续执行我的数据读取代码initWithNibName:bundle:和数据卸载dealloc。然而,仪器不停地告诉我在重复显示模态视图时存在内存泄漏,并且在调试期间,我注意到每次显示视图时都会调用initWithNibName:bundle:,但在正常执行过程中从不会调用dealloc(尽管它是由低内存条件按照苹果公司的UIViewController Class Reference文件,同样适用于viewDidUnload)。

我结束了在viewDidLoad:方法中加载数据,并且我在viewDidDisappear:中发布了它,窗口小部件显示数据并且没有泄漏。不过,我想知道是否有关于这个任何好的做法,因为对苹果的文档中的一个评论提到了这一点:

你不应该使用这种方法(即viewDidUnload)发布的用户数据或任何其他无法轻易重新创建的信息。

我假定正确的方式是在viewDidLoad中负载数据和释放在viewDidUnload给它的所有参考文献,但是在实践中,后一种方法是不叫,除非低存储器状态出现,因此每个时间被显示在视图,数据再次加载并且对旧数据的引用丢失,导致内存泄漏。

感谢您的意见。

回答

1

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

+0

是的,当我看到'initWithNibName:bundle:'在每次显示视图时都会被调用,但我使用一个简单的UIViewController,我不认为实现'UIPickerViewDelegate'和' UIPickerViewDataSource协议会改变正常的行为。我的项目的基础SDK是**最新iOS(iOS 5.0)**。 – rtovars 2012-02-24 00:34:56

+0

好吧,假设你正在为每个模态演示文稿创建一个新的视图控制器,是的,你会为每一个获得一个'loadView'。如果你覆盖,然后发现该视图,你不应该得到'loadView'。另一方面,每当你减弱模态时,你应该得到一个'deallo'c。如果你不这样做,这意味着你有一个或多个流浪的“保留”。 – smparkes 2012-02-24 00:52:42

+0

哦,你说的对,我为每一个模态演示创建一个新的视图控制器。但是,当我解散模态视图时,不会调用'dealloc'。我会再次检查保留。谢谢! – rtovars 2012-02-24 01:34:24