【问题标题】:Releasing NSData causes exception释放 NSData 导致异常
【发布时间】:2023-03-13 19:01:02
【问题描述】:

有人能解释一下为什么下面的代码会导致我的应用被炸吗?

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

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

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

我敢肯定这一定是一个新手“你不知道如何正确清理你的烂摊子”之类的事情;-)

干杯,

杰米。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您确定应该调用release - MacOS API 的一般规则是,转移所有权的方法的名称中有CopyCreate。我怀疑您获得的是对底层图像表示的引用,而不是副本,在这种情况下,您正在释放由其他东西拥有的对象。

      【讨论】:

      • 是的 - 你是对的......我刚刚重新编写了代码,将代码注释掉并逐步运行......我不应该发布它!谢谢 - 这帮助我解决了这个问题。我想是时候多读些书了:-(
      • 对于方法,单词是allocnewcopy(当然还有retain)。您正在考虑核心基础功能。不过,总体思路相同。无论如何,这是内存管理规则的强制性链接:developer.apple.com/mac/library/documentation/General/…
      【解决方案3】:

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

      【讨论】:

      • 谢谢 - 我会进一步阅读这个主题 - 我认为问题在于我对此的基本理解!
      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      相关资源
      最近更新 更多