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
如果将顺序更改为alloc
、addSubview
、removeFromSuperview
release
,会发生什么? removeFromSuperview
有可能是动态做释放部分的。
【参考方案1】:
另一种在 Xcode 中查找引用计数问题的非常简单的方法是使用 Analyze,编译器现在已经足够智能以实现自动引用计数,因此它也足够智能以发现引用计数问题。
【讨论】:
+1 呵呵,也是的 =) 我以为显而易见的事情已经完成了。【参考方案2】:解决此问题的最简单方法通常是:
在仪器中运行程序启用引用计数记录 重现问题 执行将停止 然后您分析引用计数历史并在历史中发现不适当的减量一旦掌握了窍门,定位僵尸大约需要 2 分钟。
【讨论】:
以上是关于Objective C 方法 removeFromSuperview 导致消息被发送到释放的对象的主要内容,如果未能解决你的问题,请参考以下文章