【问题标题】:Instruments and zombie; retain count is 1, 2, then suddenly -1!乐器和僵尸;保留计数是1、2,然后突然-1!
【发布时间】:2011-07-29 14:42:38
【问题描述】:

我有 Cocoa 桌面应用程序,它和许多人一样使用 NSDates。现在,其中一个 NSDates 正在变成僵尸。它在 NSUndoManager 的堆栈中使用,所以我认为有些东西我不太了解。但这没关系,因为我打算使用 Instruments 来找出它在哪里被保留和发布。除了,仪器表现出非常奇怪的行为(但我以前见过一两次的行为)。我在http://taubler.com/zombie.png 发布了截图,并尝试在此处重现 Instruments 的踪迹:

0   __NSCFDate  Malloc  1   00:08.416.441   0x114a92150 16  Foundation  getObjectValue
1   __NSCFDate  Autorelease     00:08.416.462   0x114a92150 0   Foundation  getObjectValue
2   __NSCFDate  Retain  2   00:08.416.576   0x114a92150 0   Proxy   -[SPTask setStart:]
3   __NSCFDate  Release 1   00:09.815.661   0x114a92150 0   Foundation  -[NSAutoreleasePool drain]
4   __NSCFDate  Retain  2   00:10.703.345   0x114a92150 0   Proxy   -[DraggingTask setOrigStart:]
5   __NSCFDate  Release 1   00:10.871.257   0x114a92150 0   Proxy   -[SPTask setStart:]
6   __NSCFDate  Retain  2   00:11.482.473   0x114a92150 0   Foundation  -[NSCFArray insertObject:atIndex:]
7   __NSCFDate  Zombie  -1  00:18.639.856   0x114a92150 0   Proxy   -[SPTask setStart:]

注意保留计数如何从 2 跳到 -1。有谁知道为什么会这样?确实很难找到流氓释放...

提前致谢!

【问题讨论】:

  • 有什么东西直接在上面调用dealloc吗?
  • 有趣的问题。也许我会看看我是否可以继承 NSDate 并在 dealloc 处放置一个断点。
  • 叮叮,我们赢了!这正是正在发生的事情。现在如果drawag正式回答这个问题,我可以投票给它。 :)
  • 太棒了——我也遇到了同样的问题……谢谢你的想法,戴夫!就我而言,当我应该 [释放] 时,我错误地 [dealloc]。

标签: objective-c cocoa cocoa-touch instruments


【解决方案1】:

如果您直接在对象上调用 dealloc,则可能会发生这种情况(永远不应该这样做)。

【讨论】:

  • +1 真棒洞察力。我在看这些数据时在想“这里到底发生了什么?!”
  • 同意。这完全是我的脑残——在我的类的 dealloc 方法中对 NSDate 对象调用 dealloc(而不是释放)——当只是盯着代码看时,它似乎是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多