释放NSData会导致异常

时间:2009-04-16 12:20:36

标签: iphone objective-c cocoa cocoa-touch memory

有人可以解释为什么以下代码会导致我的应用程序爆炸吗?

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

如果我注释掉'release'行,应用程序会运行......但是有几次调用包含此代码的函数并且我遇到了崩溃 - 我猜这是由于内存泄漏引起的。

即使我在函数中注释了其他所有内容而只留下这两行,当发布执行时,应用程序崩溃。

我确定这一定是新手“你不知道如何妥善清理你的烂摊子”这种事情; - )

干杯,

杰米。

3 个答案:

答案 0 :(得分:4)

查看内存管理,您应该能够在此处找到一些线程,或者您可以查看this page。我不会在这里讨论所有规则,但基本问题是myImage是自动释放的,而不是保留 - 当你手动调用release时它不与retain配对,所以当autorelease试图删除(现在无效)对象时在运行循环结束时,您的应用程序将崩溃。删除发行版将解决问题,但确实花了一些时间来了解保留/发布规则,这是最重要的事情之一。

答案 1 :(得分:4)

您确定应该致电release - MacOS API的一般规则是转让所有权的方法名称中包含CopyCreate。我怀疑你被赋予了对底层图像表示的引用,而不是一个副本,在这种情况下,你发布了一个由其他东西拥有的对象。

答案 2 :(得分:0)

你不应该释放这个对象! Apple说:“返回价值 包含PNG数据的 自动释放的 数据对象,如果生成数据时出现问题,则为nil。“(请参阅UIImagePNGRepresentation reference