在 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,我不认为实现 UIPickerViewDelegateUIPickerViewDataSource 协议会改变正常行为。我项目的基础 SDK 是 最新的 ios (iOS 5.0) 好吧,假设您正在为每个模态演示文稿创建一个全新的视图控制器,是的,您将获得一个 loadView 为每一个。如果你覆盖然后发现那个视图,你不应该得到loadView。另一方面,每次关闭模式时,您都应该得到一个dealloc。如果你不这样做,这意味着你有一个或多个流浪retains。 哦,你是对的,我为每个模态演示创建了一个全新的视图控制器。但是,当我关闭模态视图时,不会调用 dealloc。我会再次检查保留。谢谢! 我刚刚检查了创建模态视图的方式,并且过度保留了它,因此当我将其关闭时 ([self dismissModalViewControllerAnimated:YES];),它并没有被释放。我检查了 Xcode 提供的模板并相应地更新了我的代码,这解决了问题。我想我手动保留了模态视图,因为我得到了一个EXC_BAD_ACCESS error。删除多余的retain 后,我发现问题出在我的另一个控制器中的dealloc 方法中。谢谢@smparkes!

以上是关于在 UIViewController 中加载和卸载数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 控制台中加载和使用夹具

Reactjs - 如何在 reactjs 材料表中加载和映射数据

在 react 组件中加载和显示 json 数据

在 Qt GUI 中加载和显示图像

如何在 Spring Boot 中加载和遍历属性文件

在 Java 应用程序中加载和播放声音的最简单方法是啥?