iOS:ARC,没有释放内存

时间:2012-02-29 08:50:52

标签: ios memory memory-management automatic-ref-counting

我的iOS应用程序存在一个奇怪的问题。 一段时间后我的应用程序在内存中变低,因此内存警告,一切似乎都很好,但是当我检查内存使用情况时,我注意到所有对viewDidUnload的调用都没有释放大量内存,所以在我点击几下之后应用程序,它再次在内存警告,一切似乎再次正常,但没有很多内存已被释放,所以它再次在内存警告更快,然后它崩溃(大多数时间后第三次内存警告) 。这个崩溃是随机的:应用程序冻结,应用程序离开,我的调试器说app暂停,但没有糟糕的访问或sigbort,没有僵尸。 我的猜测是,内存警告无法释放足够的内存。

(我检查了所有viewDidUnload,并将每个在viewDidLoad中分配的对象设为nil)

任何帮助都会有用!

非常感谢。

3 个答案:

答案 0 :(得分:8)

所以我设法解决了我的问题。

我在所有控制器中写了“ - (void)dealloc”方法,并检查我是否应该输入它。 (在流行音乐控制器,解散等..)

每次没有,我会在控制器中一步一步地看看是什么让我的控制器保留了自己的控制权。

大多数时候,某些财产不在“不安全”的情况下 代表在“ASSIGN”中(并且不应该在assign中但在unsafe_unretained中) (来自非ARC项目的遗产......)

我还有一些带有XIB的奇怪控制器即使是空的也没有被释放。 我使用复制/粘贴逐步重建新的一个,并且完全使用完全相同的代码,新的控制器被释放,之间没有明显的区别! gnneee

至少我知道如何调试这类问题......

答案 1 :(得分:6)

我认为没有任何方法可以在没有更多数据的情况下给出具体答案,所以我能做的最好的事情就是建议您不要再猜测应用程序可能会发生什么,并学习如何衡量实际情况。在仪器下运行您的应用程序,您将能够检查泄漏,并且实际上还可以查看哪些类对您的应用程序的大部分内存负责。

您应该确保知道如何使用Leaks仪器来识别泄漏的对象,还要知道如何使用Allocations工具来识别应该已经发布的孤立(但未泄露)的对象集,或者只是您的应用没有响应的情况按照你的预期记忆警告。

https://developer.apple.com/library/ios/#documentation/developertools/conceptual/InstrumentsUserGuide/AboutTracing/AboutTracing.html可能是一个很好的起点,也有很多教程可供选择; http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorialhttp://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/是我看到的第一批结果。

答案 2 :(得分:0)

瓦西,

首先,如果你不是自己释放额外的内存,那么-didReceiveMemory警告对你没有好处,操作系统将继续询问你的内存,直到你被杀。这听起来像是你的问题。

其次,如果这不是问题,那么由于驻留内存分区的大小,您可能会被终止。确保查看仪器中的VM分配。我希望MALLOC_TINY或MALLOC_SMALL都有超过5 MB的驻留和脏脚印。由于小分配的性质,这些VM区域永远不会缩小。你真正拥有的唯一选择就是不要首先创造很多小物品。这只是你可以通过改变代码的算法来减少内存来解决的问题。

安德鲁