如何使用标签栏和导航控制器提高内存效率?

时间:2009-08-05 21:28:52

标签: ios memory-management tabbar

背景: 我有一个标签栏控制器,目前包含4个标签。其中3个选项卡是导航控制器,它显示用于查看,编辑和创建数据的表视图的层次结构。数据通常是NSStrings,取自用户并存储在全局变量中(需要从层次结构中的多个视图访问数据,以及多个选项卡)。

问题 我注意到我的应用程序在启动(~11mb )后会立即使用相当多的内存。但是,当我滚动表视图并使用导航控制器访问更多表视图和编辑一些数据时,内存使用量很快就会增加到近20mb。最糟糕的是,弹出详细视图控制器不会导致内存使用量减少。它将徘徊在 20-21mb 附近,如果我重复这个过程,我似乎会获得越来越高的内存使用率。我已经在泄漏中测试了我的应用程序,我已经解决了那里的所有问题。我怀疑我的非活动视图控制器仍然位于内存中,即使它们当前未显示。有没有办法在导航控制器的层次结构中释放不需要的视图控制器,甚至从标签栏中释放非活动视图控制器?我一直在阅读Apple的文档,他们强烈建议在视图控制器和应用代理中实现didReceiveMemoryWarning:applicationDidReceiveMemoryWarning:。我真的不知道从哪里开始这些方法。我可以发布哪些控制器以及如何重新创建它们?我认为我对此负责,但我想确定。

请注意,由于内存使用率较低,我还没有让我的应用程序终止,但是数据输入的大量重复(大量的视图控制器推送和弹出)将导致它慢慢爬行。

2 个答案:

答案 0 :(得分:3)

如果反复查看相同的屏幕导致内存使用量越来越高,则会出现泄漏。 Leaks没有发现它的事实并不意味着你没有泄漏。如果您持有不应该保留的数据,即使是垃圾收集程序也会泄漏。

使用对象分配模板拉出仪器,看看你的大部分内存占用了什么。看看那些不应该存在于记忆中的东西。如果您认为您的视图控制器内存不足,请在NSLog()中添加-dealloc并确认他们确实 内存不足。

您应该在视图控制器中实现didReceiveMemoryWarning,Apple会在Memory Management of Nib Objects中提供有关如何实施它的指导。至少你应该在didReceiveMemoryWarning中实现一个日志记录语句,这样你就知道你是否收到了警告。但这不太可能是实际问题。未能实现此方法不会导致内存泄漏,它只会阻止您在内存不足的情况下尽可能快地释放内存。

您是否遵循Cocoa Memory管理的第一条规则:您是否应该使用访问者?不要直接搞乱你的实例变量,大多数内存管理问题都会消失。

答案 1 :(得分:0)

实际上,在iPhone OS 3.0 + UIViewController子类中通常应该只实现viewDidUnload而不是didReceiveMemoryWarning。如果未显示当前UIViewController视图,则会在低内存系统中自动调用它。你应该在那里发布像IBOutlets这样的东西,这会导致实际的视图被释放,这很好,因为如果它们最终再次显示viewDidLoad将首先被调用。

didReceiveMemoryWarning在某些情况下仍然适用,如果你有某种记忆,即使显示UIViewController(如缓存)也可以摆脱。