我正在调试由其他人编写的 iPhone 应用程序,它不使用 arc。我尝试过使用 arc,但他们有很多旧代码使用一些 c 风格的 void 指针,所以当我这样做时程序会崩溃。
我已经放弃了这个想法,因为这是一个失败的事业。问题是分配/泄漏工具没有显示内存泄漏,但活动监视器显示每次用户滑动更改页面时都会泄漏内存。(每次滑动大约 1.5 Meg)不用说程序崩溃了。
作为一名 c++ 程序员,我有一些客观的 c 经验,我不了解内存被占用的所有细节。有人可以给我一些关于如何追踪这个的指示。
谢谢
我正在调试由其他人编写的 iPhone 应用程序,它不使用 arc。我尝试过使用 arc,但他们有很多旧代码使用一些 c 风格的 void 指针,所以当我这样做时程序会崩溃。
我已经放弃了这个想法,因为这是一个失败的事业。问题是分配/泄漏工具没有显示内存泄漏,但活动监视器显示每次用户滑动更改页面时都会泄漏内存。(每次滑动大约 1.5 Meg)不用说程序崩溃了。
作为一名 c++ 程序员,我有一些客观的 c 经验,我不了解内存被占用的所有细节。有人可以给我一些关于如何追踪这个的指示。
谢谢
我强烈建议您花一天时间深入阅读 Objective-C 编程指南(保留/释放/自动释放部分),直到点击为止。还有几乎可以肯定在这里发挥作用的属性。
具体来说,一些内存已被保留过多的保留,作为副作用的属性设置器或持有 UI 元素的视图(被隐藏但未从其超级视图中删除)。
在 Instruments Allocations 视图中,您可以看到未释放的对象类型 - 这应该有助于追踪它。
另一个技巧是将日志语句放在 dealloc 方法中,以查看哪些大对象没有被释放(控制台中没有日志语句)。
您的最后一个选择是在此处发布您的代码并寻求帮助,或者聘请某人让您通过此或 ARCify 代码。
编辑:周末我有一个关于如何跟踪任意对象的想法 - 以了解它们是否被释放,所以我创建了一个对象跟踪器项目。使用Tracker
该类,您可以标记对象以进行跟踪,当对象被释放时,您将在 Xcode 中看到一条日志消息。此外,您可以查询类对象以查看哪些对象仍然存在。
它通过objc_setAssociatedObject()
将自身附加到被跟踪对象来工作,然后在该对象被释放时记录自身(从而释放跟踪器对象。
所以,你可以在你的项目中尝试一些对象——视图、滚动视图、图像、数组等,看看你是否至少可以找到在应该被释放的时候没有被释放的对象。
希望这可以帮助。