我的iPhone应用程序中有一个非常奇怪的问题,我认为这与内存损坏有关:
有一次,我需要对数组进行排序,我使用-[sortArrayUsingFunction]
进行排序。
结果不正确,除非我在方法调用之前为void *test = malloc(2 * sizeof( int ))
分配一些内存,或者在排序函数中调用NSLog()
(从不调用)。
换句话说:只有在稍微增加调用排序函数之前使用的内存时,排序才有效。我认为这是因为在某些时候,内存会被破坏。
你如何调试这样的东西?
答案 0 :(得分:3)
听起来你的一些代码正在使用已发布的对象。 Apple的优秀Mac OS X Debugging Magic技术说明中提供了很多帮助调试此类错误的帮助,尤其是foundation部分。
对于您的情况,我将禁用自动释放池(设置环境变量NSEnableAutoreleasePool=NO
)或使用僵尸功能(NSZombieEnabled=YES
)来查找向已发布对象发送消息的位置。
答案 1 :(得分:3)
尝试在Valgrind下的模拟器中运行程序:
如何在模拟器下使用它:
http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind.20081224.html
您可能必须在代码示例中更改VALGRIND路径,具体取决于安装位置。
答案 2 :(得分:0)
这样的事情可能是调试的挑战。有一些工具用于检测越界访问等在其他平台上,所以我认为iPhone会有一些东西,但我不知道。
也许您应该存储两个数组副本,并将它们与差异进行比较。打印出差异。引入其中一个数组的“垃圾”的性质可能会暗示它来自何处。
此外,只需浏览在此之前运行的代码,然后重新阅读它(或者更好的是,让其他人阅读它)。你可能发现了一个错误。