3

我正在制作一个应用程序,其中包含一些带有 UIDatePicker 控件的视图控制器。

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

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

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

Instruments 没有显示任何内存泄漏。

这是 Instruments 的截图。使用的每一步都是在出现包含日期选择器的 VC 时。图表开头的基线是 2.3mb 的内存使用量。

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

干杯!

4

2 回答 2

4

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

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

它们不再在 XIB 文件中。这似乎工作得很好 - 内存飙升 3mb,然后在视图消失的第二秒又回落。现在,该应用程序始终以低于 10mb 的实时内存运行 - 它有时会飙升至 15mb,但很少见。

感谢您的帮助 sudo rm -rf 和 Rob - heapshot analysis 有助于尝试深入了解它。

于 2012-01-28T03:30:11.303 回答
4

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

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

于 2012-01-27T04:43:52.703 回答