使用ARC的UIDatePicker内存泄漏

时间:2012-01-27 02:17:30

标签: ios automatic-ref-counting uidatepicker didreceivememorywarning

我正在创建一个具有一些带有UIDatePicker控件的视图控制器的应用。

在收到大量内存警告后,我已经对原因进行了大量调试。使用仪器,我能够看到每当出现包含UIDatePicker的视图控制器时,内存使用量就会增加2-3mb。最终,这会导致记忆警告。虽然我可以在这里做很多事情,并且自从重写这些函数以来已经看到了崩溃的急剧减少,但我仍然对这种行为不满意并且想要修复它。

UIDatePicker是XIB文件的一部分。我已经尝试将它们从XIB中取出并以编程方式添加它们。这并没有解决问题。我也尝试过使用(线程安全的)单例。这会将内存使用限制在一个实例中(因此内存使用量不会增加),但我试图尽可能避免单例。我应该把它吸掉使用单身?

我在iOS 5和4.3上看到了所有运行它的设备上的这种行为。正如标题所示,我正在使用ARC。

仪器没有显示任何内存泄漏。

以下是Instruments的截图。使用中的每个步骤都是出现包含日期选择器的VC。图表开头的基线是2.3mb的内存使用量。

http://i.stack.imgur.com/1S7ns.png

干杯!

2 个答案:

答案 0 :(得分:4)

您要在此处使用的工具称为heapshot。它将帮助您缩小被错误保持的对象类型。正如@sudo所说,问题可能出在你的委托而不是日期选择器本身。你可能没有在最严格的意义上“泄漏”。你可能只是抓住你不想要的记忆(看起来很像泄密)。

您应该仔细查看是否有任何循环强引用。例如,您是否拥有对其委托具有强引用的对象?这通常会导致保留循环(在ARC下永远不会释放)。快照可以帮助您找到这些对象。

答案 1 :(得分:4)

我似乎已经解决了我自己的问题。因为这是一个inputView,我还有一个带有“完成”按钮的UIToolbar作为inputAccessoryView。

所以现在我在viewWillAppear中以编程方式创建这些。在viewWillDisappear中,我将UITextField的inputView和inputAccessoryView设置为nil,将日期选择器和日期选择器工具栏设置为nil。

它们不再在XIB文件中。这似乎工作得非常好 - 内存峰值增加3mb,然后在第二次视图消失时返回。现在,该应用程序一直运行在10mb以下的实时内存 - 有时甚至很少达到15mb。但

感谢帮助sudo rm -rf和Rob - 快照分析有助于尝试并深入了解它。