【问题标题】:Objective C method removeFromSuperview causes message being sent to deallocated objectObjective C 方法 removeFromSuperview 导致消息被发送到释放的对象
【发布时间】:2011-12-03 10:35:18
【问题描述】:

在 View 对象中调用 removeFromSuperview 时遇到问题。分配历史(根据工具)如下:

myView 分配 -> myView 1

addSubview:myview -> myView 2

myView 发布 -> myView 1

myView removeFromSuperview -> myView 0

myView dealloc -> myView -1(由 removeFromSuperview 调用)

我知道调用dealloc方法是因为引用计数达到0。但是我不明白为什么它将引用计数减少1,导致消息被发送到deallocated方法。

另外,我只能使用仪器来检测它。使用 xcode 它不会崩溃。

任何帮助将不胜感激。 非常感谢。

【问题讨论】:

  • 您是手动调用最后一个myView dealloc还是由removeFromSuperview调用?
  • 正在被 removeFromSuperview 调用。
  • 您是否在没有先发布 myView 的情况下尝试了您的应用,所以它的计数仍然是 2?我认为removeFromSuperview 会自动处理额外的alloc
  • 是的,但在那种情况下,我用仪器检查过,它泄漏了。计数保持在 +1
  • 如果将顺序更改为allocaddSubviewremoveFromSuperviewrelease,会发生什么? removeFromSuperview 有可能是动态做释放部分的。

标签: objective-c memory-management dealloc


【解决方案1】:

另一种在 Xcode 中查找引用计数问题的非常简单的方法是使用 Analyze,编译器现在已经足够智能以实现自动引用计数,因此它也足够智能以发现引用计数问题。

【讨论】:

  • +1 呵呵,也是的 =) 我以为显而易见的事情已经完成了。
【解决方案2】:

解决此问题的最简单方法通常是:

  • 在仪器中运行程序启用引用计数记录
  • 重现问题
  • 执行将停止
  • 然后您分析引用计数历史并在历史中发现不适当的减量

一旦掌握了窍门,定位僵尸大约需要 2 分钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2017-06-28
    相关资源
    最近更新 更多