有人可以解释为什么以下代码会导致我的应用程序爆炸吗?
NSData *myImage = UIImagePNGRepresentation(imageView.image);
:
[myImage release];
如果我注释掉'release'行,应用程序会运行......但是有几次调用包含此代码的函数并且我遇到了崩溃 - 我猜这是由于内存泄漏引起的。
即使我在函数中注释了其他所有内容而只留下这两行,当发布执行时,应用程序崩溃。
我确定这一定是新手“你不知道如何妥善清理你的烂摊子”这种事情; - )
干杯,
杰米。
答案 0 :(得分:4)
查看内存管理,您应该能够在此处找到一些线程,或者您可以查看this page。我不会在这里讨论所有规则,但基本问题是myImage是自动释放的,而不是保留 - 当你手动调用release时它不与retain配对,所以当autorelease试图删除(现在无效)对象时在运行循环结束时,您的应用程序将崩溃。删除发行版将解决问题,但确实花了一些时间来了解保留/发布规则,这是最重要的事情之一。
答案 1 :(得分:4)
您确定应该致电release
- MacOS API的一般规则是转让所有权的方法名称中包含Copy
或Create
。我怀疑你被赋予了对底层图像表示的引用,而不是一个副本,在这种情况下,你发布了一个由其他东西拥有的对象。
答案 2 :(得分:0)
你不应该释放这个对象! Apple说:“返回价值 包含PNG数据的 自动释放的 数据对象,如果生成数据时出现问题,则为nil。“(请参阅UIImagePNGRepresentation reference)