2009-04-16 142 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