Objective C 方法 removeFromSuperview 导致消息被发送到释放的对象

Posted

技术标签:

【中文标题】Objective C 方法 removeFromSuperview 导致消息被发送到释放的对象【英文标题】:Objective C method removeFromSuperview causes message being sent to deallocated object 【发布时间】: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 有可能是动态做释放部分的。 【参考方案1】:

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于Objective C 方法 removeFromSuperview 导致消息被发送到释放的对象的主要内容,如果未能解决你的问题,请参考以下文章

objective c, protocol

从 Objective C 类调用 Swift 方法

Objective C 语法基础

Objective C 语法基础

Objective -C 类问题

Objective C 使用字符串调用方法