iOS4 - 快速上下文切换

Posted

技术标签:

【中文标题】iOS4 - 快速上下文切换【英文标题】:iOS4 - fast context switching 【发布时间】:2010-07-06 11:02:52 【问题描述】:

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

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

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

我有两个疑问:

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

提前致谢。

【问题讨论】:

1.不是 30MB。较旧的 ios 设备只有 128MB 内存,因此仅您的应用程序就可以填充大约 23% 的内存... 2. 如果您真的泄漏了 30MB,您可能没有在某个地方发布某些东西,这不是 UINavigationController 的错. 您好 Douwe,感谢您的回复。为什么我怀疑 UINavigationController 因为,我一直在里面推视图控制器。当我从导航控制器弹出视图控制器时,不会在我释放定义的实例变量的地方调用 dealloc 方法。并且所有这些实例变量都没有清除内存。难道我做错了什么?我是否必须在其他地方而不是在 dealloc 中清除实例变量? 在您的应用程序的其他地方,您是否还有其他对视图控制器的引用?如果你弹出它们,但在其他地方仍然有对控制器的引用,它不会被 GCed 【参考方案1】:

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

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

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

这是一个神奇的 sn-p,当我不知道为什么我仍然保留一些东西时,它可以帮助我很多。

- (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 函数名称作为字符数组。

【讨论】:

【参考方案2】:
    当 iOS 开始耗尽内存时,它会尝试终止使用最多内存的后台进程。因此,虽然没有绝对的好数字,但尽量减少使用的内存量是个好主意。将其保留在 30Mb 就等于保证您的应用会被杀死 除非你想改变你的用户界面,否则不需要使用UINavigationController 以外的任何东西来处理你的后退按钮。我认为这里的问题是,如果没有在弹出或关闭时调用 dealloc,那么您就有内存泄漏

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

【讨论】:

以上是关于iOS4 - 快速上下文切换的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 C语言上下文的快速切换

进程控制

进程控制

进程控制

线程的创建

CPU上下文切换