2010-09-12 75 views
0

我的应用程序的一部分从互联网下载图像,并将它们存储在一个可变数组中。这是为了在用户每次查看它们时都不必下载它们。当我退出处理这些图像的视图时,可变数组会被释放。如果数组中只存储一个图像,则一切运行顺利。但是,如果存在多个图像,则应用程序会崩溃并显示EXC_BAD_ACCESS。使用NSZombies,我得到以下错误:ObjC内存调试帮助

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

不过,我并不在我的应用程序使用isKindOfClass消息,所以它显然被一些其他的系统方法发送。是什么导致这个消息被发送,我该如何解决这个问题,为什么只有当数组中有多个图像时才会发生?谢谢。

+0

你能否给我们提供一些源代码? – tia 2010-09-12 17:33:00

回答

1

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

例如:

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

在这里,你没有自己的目标图像(因为你没有使用的alloc创建或复制),所以你不需要将其释放。数组中的指针现在指向一个保留计数为零的对象,该对象最终将被释放。

出于同样的原因,在上例中使用autorelease而不是release同样是错误的。

+0

谢谢。这非常有帮助!非常感谢, – 2010-09-12 22:20:05

+0

好消息!很高兴帮助。 – 2010-09-13 07:22:21

0

在乐器中使用僵尸乐器。 (运行 - >使用性能工具运行 - > Zombies)

仪器可以准确告诉你代码在哪里发送了一个释放对象。更重要的是,它可以告诉你之前的所有保留和发布,并且因此确切地说明了过去发布的地方和内容。

查看Instruments documentation了解更多信息。

+0

我会检查出来。很快,为什么Zombie会在Xcode的下拉菜单中变灰? – 2010-09-12 17:41:46