在 UIViewController 中加载和卸载数据
Posted
技术标签:
【中文标题】在 UIViewController 中加载和卸载数据【英文标题】:Loading and unloading data in UIViewController 【发布时间】:2012-02-23 21:40:51 【问题描述】:我需要在我的UIViewController
中加载一些数据,以便在 iPhone 模式视图中显示UIPickerView
小部件。
我做了一些研究,在 SO 中发现了这个 answer。我继续在initWithNibName:bundle:
中实现我的数据读取代码,并在dealloc
中实现数据卸载。但是,Instruments 一直告诉我在重复显示模态视图时存在内存泄漏,并且在调试过程中我注意到每次显示视图时都会调用 initWithNibName:bundle:
,但在正常执行下从未调用 dealloc(尽管它是由低触发- 根据 Apple 的 UIViewController Class Reference 文档的内存条件,同样适用于 viewDidUnload
)。
我最终在viewDidLoad:
方法中加载数据并在viewDidDisappear:
中发布它,小部件显示数据并且没有泄漏。但是,我想知道这方面是否有任何好的做法,因为在 Apple 文档中的一条评论中提到了这一点:
您不应使用此方法(即 viewDidUnload)来释放用户数据或任何其他无法轻松重新创建的信息。
我认为正确的方法是在 viewDidLoad 中加载数据并在 viewDidUnload 中释放对它的所有引用,但实际上,除非出现内存不足的情况,否则不会调用后一种方法,因此每次显示视图时,数据再次加载,对旧数据的引用丢失,导致内存泄漏。
感谢您的 cmets。
【问题讨论】:
【参考方案1】:如果每次显示您的视图时都调用viewDidLoad
,则会发生一些不好的事情。 viewDidAppear
应该被调用,但 viewDidLoad
应该只在第一次需要视图时调用,并且如果需要视图并且调用 viewDidUnload
。
【讨论】:
是的,当我看到每次显示视图时都会调用initWithNibName:bundle:
时,我的想法是一样的,但我使用的是简单的 UIViewController,我不认为实现 UIPickerViewDelegate
和UIPickerViewDataSource
协议会改变正常行为。我项目的基础 SDK 是 最新的 ios (iOS 5.0)。
好吧,假设您正在为每个模态演示文稿创建一个全新的视图控制器,是的,您将获得一个 loadView
为每一个。如果你覆盖然后发现那个视图,你不应该得到loadView
。另一方面,每次关闭模式时,您都应该得到一个deallo
c。如果你不这样做,这意味着你有一个或多个流浪retain
s。
哦,你是对的,我为每个模态演示创建了一个全新的视图控制器。但是,当我关闭模态视图时,不会调用 dealloc
。我会再次检查保留。谢谢!
我刚刚检查了创建模态视图的方式,并且过度保留了它,因此当我将其关闭时 ([self dismissModalViewControllerAnimated:YES];
),它并没有被释放。我检查了 Xcode 提供的模板并相应地更新了我的代码,这解决了问题。我想我手动保留了模态视图,因为我得到了一个EXC_BAD_ACCESS error
。删除多余的retain
后,我发现问题出在我的另一个控制器中的dealloc
方法中。谢谢@smparkes!以上是关于在 UIViewController 中加载和卸载数据的主要内容,如果未能解决你的问题,请参考以下文章