【问题标题】:iOS Leak Tool vs Activity MonitoriOS泄漏工具与活动监视器
【发布时间】:2013-05-04 23:27:47
【问题描述】:

我正在调试由其他人编写的 iPhone 应用程序,它不使用 arc。我尝试过使用 arc,但他们有很多旧代码使用一些 c 样式的 void 指针,所以当我这样做时程序会崩溃。

我已经放弃了这个想法,因为这是一个失败的事业。问题是分配/泄漏工具没有显示内存泄漏,但活动监视器显示每次用户滑动更改页面时都会泄漏内存。 (每次滑动大约 1.5 Meg)不用说程序崩溃了。

我本人是一名 c++ 程序员,有一些客观的 c 经验,我不了解内存被占用的所有细节。谁能给我一些关于如何追踪这个的指示。

谢谢

【问题讨论】:

    标签: ios memory-leaks activity-monitor


    【解决方案1】:

    我强烈建议您花一天时间深入阅读 Objective-C 编程指南(保留/释放/自动释放部分),直到点击为止。还有几乎可以肯定的属性。

    具体来说,一些内存已被保留过多的保留,作为副作用的属性设置器或持有 UI 元素的视图(被隐藏但未从其超级视图中删除)。

    在 Instruments Allocations 视图中,您可以看到未释放的对象类型 - 这应该有助于追踪它。

    另一个技巧是将日志语句放在 dealloc 方法中,以查看哪些大对象没有被释放(控制台中没有日志语句)。

    您的最后一个选择是在此处发布您的代码并寻求帮助,或者聘请某人帮助您解决此问题或对代码进行 ARCify。

    编辑:周末我想到了一个关于如何跟踪任意对象的想法 - 以了解它们是否被释放,所以我创建了一个 Object Tracker project。使用Tracker 类,您可以标记对象以进行跟踪,当对象被释放时,您将在 Xcode 中看到一条日志消息。此外,您可以查询类对象以查看哪些对象仍然存在。

    它通过使用objc_setAssociatedObject() 将自身附加到被跟踪对象,然后在该对象被释放时记录自身(从而释放跟踪对象。

    因此,您可以在您的项目中尝试一些对象 - 视图、滚动视图、图像、数组等,看看您是否至少可以找到在应该被释放时没有被释放的对象。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。我了解objective c如何处理内存的原理。 ARC 不是一个选项,因为重写所有不兼容的代码需要很长时间,正如我所说我已经尝试过这个选项。分配工具没有显示任何内存泄漏,这就是为什么我提到活动监视器在分配没有显示它的地方显示它。我不能发布代码,因为我不完全确定哪些部分是问题所在,而且我相信您不想通读代码页。我使用了 dealloc 技巧,但我认为问题在于 UIImages 没有释放。
    • 任何其他想法将不胜感激。
    • 我已经设法改用 ARC。使用的内存较少,但我仍然有同样的问题。分配工具不会仅在活动监视器中显示问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多