当应用程序进入后台运行状态时,有多少脏内存使用是好的。在苹果视频中,我们提到应该尽可能减少脏记忆。
但在我的应用程序中,我使用导航控制器来推送和弹出视图。从大约20个不同页面移动后,脏内存使用量达到30 MB左右。
同样在“dismissModalViewControllerAnimated”和“popViewControllerAnimated”上,不调用dealloc。
我有两个疑问:
提前致谢。
答案 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)
UINavigationController
处理后退按钮的任何其他内容。我认为这里的问题是,如果在弹出或关闭时没有调用dealloc
,则会发生内存泄漏几乎所有视图控制器都有有效缓存的数据,并且可以在应用程序返回前台时重新生成。想一想当应用程序运行时收到内存警告时释放的数据。 (你正在回应内存警告,对吗?)这是你进入后台时应该发布的东西。