ObjC内存调试帮助

时间:2010-09-12 17:18:47

标签: objective-c debugging

我的部分应用从互联网下载图像并将其存储在可变数组中。这样,每次用户想要查看它们时都不必下载它们。当我退出处理这些图像的视图时,可变数组将被释放。如果阵列中只存储了一个图像,则一切都运行顺畅。但是,如果有多个图像,则应用程序会因EXC_BAD_ACCESS而崩溃。使用NSZombies,我收到以下错误:

*** -[UIImage isKindOfClass:]: message sent to deallocated instance 0x5b8eae0

但是,我没有在我的应用程序中使用isKindOfClass消息,所以它显然是由其他一些系统方法发送的。是什么导致发送此消息,如何解决此问题,为什么只有在阵列中有多个图像时才会发生?感谢。

2 个答案:

答案 0 :(得分:1)

听起来你过度释放你的图像对象。与所有Cocoa集合类一样,NSMutableArray实例保留添加到其中的对象,并在它自身发布时释放它们。如果使用不增加其保留计数的调用创建对象,然后在将其添加到数组后将其释放,则会看到此类错误。

例如:

UIImage *image = [UIImage imageWithData:someData];
[myArray addObject:image];
[image release]; // <-- BAD!

此处您不拥有对象图像(因为您没有使用alloc或copy创建它),因此您无需释放它。数组中的指针现在指向一个保留计数为零的对象,最终将被解除分配。

出于同样的原因,在上面的示例中使用autorelease代替release同样是错误的。

答案 1 :(得分:0)

在乐器中使用Zombies乐器。 (运行 - &gt;使用Performance Tools运行 - &gt; Zombies)

仪器可以准确地告诉您代码在哪里发送了一个解除分配的对象。更重要的是,它可以告诉您之前的所有保留和释放,因此,确切地说,过度释放的位置和内容。

有关详细信息,请参阅Instruments documentation