我有一个基于导航的应用程序,我用“init with nib name”推送uitableviews。
我用仪器测试了应用程序没有泄漏,在所有分配菜单中,我看到大约2-3 MB的实时字节。当我开始导航并浏览30页时,在仪器中我可以从“实时字节”中看到它为每个推送的uitableview增加了大约40 KB,我认为这是正常的。
然后我想在我的IOS4手机和我在应用商店中找到的免费活动监视器应用程序进行测试。好吧,我可以看到,在每次推送中,设备中的总可用内存减少了大约800KB!
所以30次推送后28 MB的可用内存消失了,当我通过导航“返回”时,我可以看到内存再次被释放。
如果你愿意,我可以发布一些代码,但是我无法找到可以在我的uitableView中获取800Kb内存的东西,所有的alloc都被释放了,我没有分配任何图像文件。我只是发送几行信息显示在表格中。
你的建议是什么?哪些部分应该检查我的代码?或者这是正常的,推送的视图可以占用内存的KB。因为如果我的应用程序中有100个页面,那么它可以增长到100 Mb的内存
由于
答案 0 :(得分:2)
我很确定如果您使用“内存工具”(参见图片)检查Instrument中的内存,您将看到与使用免费iphone应用程序所看到的相同的内存使用情况。
实际上,根据我的经验,Instruments会根据您使用的工具为您提供有关内存使用情况的不同信息;并且,不幸的是,记忆工具是提供最“现实”估计的工具。我无法解释为什么,但我毫不奇怪,对于几MB的“实时字节”,你有更多MB的“真实记忆”。
无论如何,我不担心。如果你达到28MB并且应用程序没有被杀死,你可能会使用“以后的”设备(不是iPod touch,也不是iPhone 3);我想如果你在旧设备上测试,整体内存占用可能会更低(即,你的应用程序会获得更多的内存警告,如果一切正确完成,将卸载更多视图,释放更多内存)。
重要的是,IMO,当你回去时,记忆就会恢复。理想情况下,它应该完全恢复,但这并不总是很容易实现。
关于应用的整体内存消耗,我的想法是:
首先,您应该检查当您的应用获得内存警告时会发生什么;我希望你的许多以前加载的视图都会被卸载并恢复内存;您可以覆盖控制器中的didReceiveMemoryWarning
以记录它们已被卸载(不要忘记调用super
)并在需要时恢复内存(系统将知道它何时执行);正如我所说,我认为你的应用程序正在填充内存,因为它没有收到任何内存警告,重点是收到内存警告时会发生的事情;如果内存恢复,那么没问题;问题是当你收到警告并且内存没有显着减少时;
如果问题仍然存在(即内存恢复机制无法正常工作),您可以在推送新控件之前从导航控制器中考虑popping
视图控制器。如果这对您有用,您可以试试......