2009-04-16 179 views
3

有人可以解釋爲什麼下面的代碼會導致我的應用程序被炸?發佈NSData導致異常

NSData *myImage = UIImagePNGRepresentation(imageView.image); 
    : 
[myImage release]; 

如果我註釋掉「版本」行,該應用程序運行......但幾次調用包含此代碼的功能,我得到一個崩潰 - 我想通過一個內存泄漏引起的。

即使我在函數中註釋了其他所有內容,只留下這兩行,執行發行版時,應用程序會崩潰。

我敢肯定,這一定是個新手,「你不知道如何正確地清理你的爛攤子」之類的話;-)

乾杯,

傑米。

回答

4

您確定應該致電release - MacOS API的一般規則是轉讓所有權的方法的名稱中包含CopyCreate。我懷疑你正在被給予對底層圖像表示的引用,而不是副本,在這種情況下你會釋放其他東西所擁有的對象。

+0

是的 - 你是對的...我只是再次通過代碼,評論代碼和逐步運行...我不應該釋放它!謝謝 - 這幫助我解決了這個問題。我想我可以多讀幾本書:-( – badmanj 2009-04-16 12:47:19

4

研究內存管理,你應該可以在這裏找到一些線程,或者你可以看看this page。在這裏我不會涉及所有規則,但基本問題是myImage是自動釋放的,而不是保留 - 當你手動調用release時,它不與保留對配對,所以當autorelease試圖刪除(現在是無效的)對象時在運行循環結束時,您的應用程序將崩潰。刪除這個版本將會解決這個問題,但是花一些時間去了解保留/版本規則,這是要理解的最重要的事情之一。

+0

謝謝 - 我會更多地閱讀這個主題 - 問題是我對此的基本理解,我想! – badmanj 2009-04-16 12:46:11

0

您不應該釋放此對象! Apple說:「返回值 和自動發佈包含PNG數據的數據對象,或者如果生成數據時出現問題,則爲零。 (請參閱UIImagePNGRepresentation reference