2010-09-12 96 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