iOS4 - 快速上下文切换

时间:2010-07-06 11:02:53

标签: iphone ios4 context-switching

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

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

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

我有两个疑问:

  1. 上线可以接受多少脏内存?
  2. 支持后退按钮的导航控制器的替代方案是什么?
  3. 提前致谢。

2 个答案:

答案 0 :(得分:4)

如果没有调用dealloc,你仍然可以保留你的UIViewControllers。

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

一种可以调试的方法是在UIViewController中重载retain和release,并设置一个断点并记录retainCount。

这是我留下来的一个神奇的片段,当我无法弄清楚为什么我还在保留某些东西时,这对我帮助很大。

- (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数组。

答案 1 :(得分:0)

  1. 当iOS开始耗尽内存时,它会尝试终止使用最多内存的后台进程。因此,虽然没有绝对好的数字,但最大限度地减少使用多少内存是一个好主意。将其保留在30Mb等于保证您的应用程序将被杀死
  2. 除非您想要更改UI,否则无需使用UINavigationController处理后退按钮的任何其他内容。我认为这里的问题是,如果在弹出或关闭时没有调用dealloc,则会发生内存泄漏
  3. 几乎所有视图控制器都有有效缓存的数据,并且可以在应用程序返回前台时重新生成。想一想当应用程序运行时收到内存警告时释放的数据。 (你正在回应内存警告,对吗?)这是你进入后台时应该发布的东西。