Iphone iOS4-快速上下文切换

Iphone iOS4-快速上下文切换,iphone,ios4,context-switching,Iphone,Ios4,Context Switching,当应用程序进入后台运行状态时,有多少脏内存的使用是值得考虑的。在apple视频中提到,脏内存应该尽可能减少 但在我的应用程序中,我使用导航控制器来推送和弹出视图。从大约20个不同的页面移动后,脏内存使用量达到30 MB左右 同样在“dismissModalViewControllerAnimated”和“popViewControllerAnimated”上,不调用dealloc 我有两个疑问: 有多少脏内存可以使用 支持后退按钮的导航控制器的替代方案是什么 提前感谢。如果没有调用dealloc

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

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

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

我有两个疑问:

  • 有多少脏内存可以使用
  • 支持后退按钮的导航控制器的替代方案是什么

  • 提前感谢。

    如果没有调用dealloc,您的UIViewController可能仍然保留

    您可能正在这些UIViewController中设置委托或其他类,这些类保留并引用了树的备份(循环引用)

    调试的一种方法是在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];
    }
    
    \uuuu PRETTY\u FUNCTION\uuuuu
    是一个特殊的隐藏宏,它以字符数组的形式给出了一个相当客观的C函数名

  • 当iOS开始耗尽内存时,它会试图杀死使用最多内存的后台进程。所以,虽然没有绝对好的数字,但尽量减少使用的内存是个好主意。将其设置为30Mb等于保证你的应用程序将被终止
  • 除非您想更改UI,否则无需使用
    UINavigationController
    来处理后退按钮。我认为这里的问题是,如果在pop或DISCLISE中未调用
    dealloc
    ,则内存泄漏

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

    1。不是30MB。较旧的iOS设备只有128MB的内存,所以单是你的应用程序就可以占到大约23%。。。2.如果你真的泄漏了30MB,你可能没有释放什么东西,在某个地方,这不是
    UINavigationController
    的错误。嗨,Douwe,谢谢你的回复。为什么我怀疑UINavigationController,因为我一直在推视图控制器。当我从导航控制器中弹出视图控件时,在释放定义的实例变量的地方,不会调用dealloc方法。内存没有被所有这些实例变量清除。我做错什么了吗?我是否必须清除其他地方的实例变量而不是dealloc中的实例变量?您是否在应用程序的其他地方对视图控制器有任何其他引用?如果你正在弹出它们,但在其他地方仍然有控制器的引用,它将不会得到GCD