6

当应用程序进入后台运行状态时,有多少脏内存使用是好的。在苹果视频中提到应该尽可能减少脏内存。

但在我的应用程序中,我使用导航控制器来推送和弹出视图。从大约 20 个不同的页面移动后,脏内存使用量达到 30 MB 左右。

同样在“dismissModalViewControllerAnimated”和“popViewControllerAnimated”上,不调用 dealloc。

我有两个疑问:

  1. 可以接受多少脏内存才能上线?
  2. 导航控制器支持后退按钮的替代方法是什么?

提前致谢。

4

2 回答 2

4

如果没有调用 dealloc,您可能仍然保留 UIViewControllers。

也许您在这些 UIViewControllers 中设置委托或其他类,这些类保留并引用备份树(循环引用)。

一种可以调试的方法是在 UIViewController 中重载保留和释放,并设置断点并记录保留计数。

这是我留下的一个神奇片段,当我无法弄清楚为什么我仍然保留一些东西时,它可以帮助我很多。

- (id)retain
{
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    return [super retain];
}
- (void)release
{
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    [super release];
}
- (id)autorelease
{
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]);
    return [super autorelease];
}

__PRETTY_FUNCTION__是 CLang 中一个特殊的隐藏宏,它提供了一个漂亮的 Objective-C 函数名称作为 char 数组。

于 2011-02-11T08:09:08.167 回答
0
  1. 当 iOS 开始耗尽内存时,它会尝试终止使用最多内存的后台进程。因此,虽然没有绝对的好数字,但尽量减少使用的内存量是个好主意。将其保留在 30Mb 就等于保证您的应用程序将被杀死
  2. 除非您想更改 UI,否则无需使用 a 以外的任何东西UINavigationController来处理您的后退按钮。我认为这里的问题是,如果dealloc没有在弹出或关闭时调用,则存在内存泄漏

几乎所有视图控制器都具有有效缓存的数据,并且可以在应用返回前台时重新生成。想想当应用程序运行时收到内存警告时释放的数据。(您正在响应内存警告,对吗?)当您进入后台时应该释放这些东西。

于 2011-02-11T10:37:03.643 回答