使用迁移工具将我的应用迁移到ARC并解决所有悬而未决的问题后,在分配工具中进行的快速测试显示我在应用中做的任何事情都是泄漏内存。
这是一个非常大的应用程序,迁移需要2个小时才能完成(包括检查我所做的每一个更改 - 所有这些都看起来很好!)
我检查了所有编译器标志两次,以确保确实为每个文件和项目级别启用了ARC。
以前迁移到ARC我的应用程序完全没问题。通过多次重复相同的操作来获取Heapshot时,绝对没有堆增长。这是100%无泄漏,没有遗弃的记忆。它是完美的。现在这是一个巨大的泄漏事情,就像没有明天一样。
知道发生了什么事吗?
答案 0 :(得分:5)
您尚未在此处显示任何代码,以突出显示导致对象在内存中累积的应用程序部分,因此很难为您的情况提供具体的答案。但是,根据我在Mac和iOS上迁移多个项目的经验,我可以提供一些广泛的建议。
在another answer中,我详细描述了您在自动引用计数下仍需要注意的几个内存管理区域。这里主要关注的是保留周期和Core Foundation对象(或其他非Objective-C内存分配)。
鉴于您的应用程序之前没有在重复操作上累积内存并且通过ARC迁移工具干净地移植,因此保留周期更可能是与Core Foundation的不正确桥接等问题。迁移工具倾向于突出使用Core Foundation的问题区域,并在它们成为问题之前捕获它们。如何处理它们可能很棘手,但你至少知道它们在那里。
保留周期可能是微妙的错误以追查。查找使用强实例变量或属性设置的代理,而不是弱或不安全的代理。检查您对块或基于块的通知观察器的使用,因为它们可以保留对创建它们的对象的引用(特别是在观察者的情况下)并创建周期。检查导航层次结构中的对象,使用强引用指向更高的对象。
使用Instruments通过Leaks and Allocations工具追踪正在累积的特定对象。在后者中,在重复操作之间使用堆镜头来查看在每次传递后创建和仍然存活的对象。您还应该能够识别这些对象的分配位置,希望能够找回不正确的强引用。
Leaks仪器有一个新的保留周期检测器,可以看到下面板并更改" Leaks"弹出到" Cycles&罗茨&#34 ;.这并不能解决所有问题,但它可以提供帮助。
我现在已经将Mac和iOS上的多个项目移动到ARC,包括使用GC的Mac应用程序,并且在每种情况下应用程序都更好。这个过程暴露了我多年来在我的内存管理中遗漏的错误,平均减少了我项目代码的3%,并且导致了我以前垃圾收集的Mac应用程序的一些显着的性能提升(我没有基准测试)我的iOS还是)。