2010-06-04 58 views
4

我有一个内置5个视图控制器的基于导航控制器的应用程序。当我推视图控制器时,我分配了一些内存,当我回到popViewController时,正确调用了我的delloc()方法。我确定dealloc以正确的方式被调用,用于我推送和弹出的每个视图控制器。不过,当我使用Instruments运行应用程序时(从性能工具 - >对象分配,泄漏开始),对我来说有一种奇怪的行为。 当一个视图控制器弹出内存使用不会减少,确切地说,它不会像预期的那样减少: 当我启动应用程序时,它使用950 KB,然后我推动第一个视图控制器,内存使用量增加到1 ,56MB,最后我弹出视图控制器,内存使用现在是1,55MB。当弹出一个控制器时,UINavigationController内存不会减少

这种行为是否正确?我确信每当我弹出一个视图时,每个dealloc方法都会被正确调用,并且Leaks仪器不会显示任何内存泄漏。 我猜操作系统是“保留”在某种程度上的观点,以便第二次我推动相同的视图控制器的加载过程是更快...

有人可以确认这种行为是正确的吗? 感谢

See this Screenshot from Instruments

+0

Ps。仪器是否设置为每X秒检查一次泄漏或手动检查? – RickiG 2010-06-04 10:23:46

+0

它设置为每10秒自动检查一次。会改变什么吗? – ggould75 2010-06-04 11:03:13

回答

6

这是符合市场预期。 “你只负责你分配,复制的对象”的内存处理规则也适用于此处。

当你到navigationController推的东西,我以为你不喜欢这样写道:

MyController *myCon = [[MyController alloc] init]; 
[self.navigationController pushViewController:myCon animated:YES]; 
[myCon release]; //You have alloc and release. 

的navigationController经常处理的层级,其中用户向下钻取数据集,并再次向上。当内存充足时,通过抓住你的控制器,navigationControllers的保存方式必须再次实例化控制器5秒。稍后当用户点击“返回”时。你可以看到这个,因为dealloc永远不会被调用,但是当你备份时调用viewWillAppear和viewDidAppear。 如果内存不足,navigationController将开始在其堆栈上释放控制器。

但是!确保前进和后退不会导致viewController被一次又一次地实例化,这会使内存占用增加并出现泄漏。 navigationController应该注意到它已经在其堆栈中有viewController并且只显示它。

你应该能够遍历所有的视图,如果它们“适合”在内存中,应用程序不应该从这里增加内存占用。

+0

谢谢你的回复。如你所描述的,我实例化视图控制器。如果我理解的很好,那么我可以假设,当点击返回按钮时,即使调用了dealloc方法,导航控制器也会“保留”我的控制器?是对的?因为我的dealloc总是被调用(我使用的是nslog)。 我不太明白的一点是,如果它已经被释放,它如何保留我的控制器?或者是保留在控制器内部的视图? – ggould75 2010-06-04 11:56:56

+0

如何确保回退和前进不会导致viewControllers一次又一次地被实例化?当我点击某个视图时,它会更改导航栏而不是视图。为什么? – ma11hew28 2010-09-03 02:29:45

+0

有道理@RickiG。你是从观察还是从文档中了解到这种行为? – 2012-12-14 17:36:54

相关问题