【问题标题】:Strange memory error dealloc/release奇怪的内存错误释放/释放
【发布时间】:2011-09-20 13:21:59
【问题描述】:

我在 iPhone 上的 Objective-C 程序中遇到了一个奇怪的错误。以下是发生的事情:

  • 我遇到 EXC_BAD_ACCESS 崩溃。
  • 好吧,僵尸开始了,日志告诉我它是关于一个 CFNumber 获得释放,但已经被释放。仍然没有硬饼干。
  • 我一直在调试,直到遇到带有两个 NSNumber 的块。我的代码中没有 CFNumber,所以我认为是这些行。
  • 我尝试保留它们,但没有成功,甚至用 nil 填充它们,用新值覆盖它们等等。仍然没有。
  • 我将这些行注释掉。现在日志一直在纠缠相同的 CFNumber,但现在正在发送一个“doubleValue”(而不是“release”),而它已经被释放了。我的代码中没有“doubleValue”。

这里发生了什么?僵尸在弄乱我的代码吗?我在这里陷入了死胡同。非常感谢任何帮助。

亲切的问候,

雷德

【问题讨论】:

  • 猜测其他自动释放的内容,并且该内存正在被您日志中出现的其他内容占用。
  • 我无法解决大部分问题,但是 CFNumbers 和 NSNumbers 是免费桥接的,所以它们完全一样,以至于无法区分机器级别。指向一个的指针也是指向另一个的指针。所以你调查 NSNumber 实例是对的。
  • 您是否运行过分析器?有什么警告吗?如果你有并且看起来不错,下一步是使用泄漏的 Instruments 进行分析。
  • 好的,伙计们,搞定了。显然我只是用非保留变量覆盖了一个属性(保留了)。因此,“已解除分配”错误。所以,也就是说,我分析了代码,修复了所有不好的版本,改掉了坏习惯,学到了很多东西。谢谢!

标签: ios objective-c memory-management


【解决方案1】:

遗憾的是,没有代码我们无能为力。

以下是一些需要注意的一般原则,它们会让您的生活更轻松。

你指的是当前班级。

  • 如需长期使用,请保留。
  • 如果你在函数末尾不需要它,不要保留它(alloc,然后在最后释放)如果你没有保留它,不要释放它。
  • 如果您没有分配它,请不要释放它。
  • 如果您要返回您分配的对象,因此将失去对它的控制,自动释放(几乎是它的设计目的)。这符合原则 3 和 4,因为这意味着调用类将需要做出保留或释放它的决定。

希望这可以帮助您查明问题。

【讨论】:

    【解决方案2】:

    您不需要手动释放由便利构造函数创建的任何对象,请参阅更多关于 convenience constructors

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多