2011-08-24 113 views
3

我收到一个错误“[myObject method]:发送到解除分配的实例0xbc05440的消息”。这一定是因为我发布了一些我仍然需要的东西。dealloc从哪里开始?

我寻找适当的nils,发布等,但我无法找到我释放此对象的位置。

然后我在myObject的dealloc中放置了一个break。这捕获了dealloc,但堆栈只显示汇编代码。如果我从这个地方走,我没有得到任何提示。我如何找到dealloc的起始位置?

+0

你是专门保留它吗?它可能正在被自动释放。 –

+2

尝试运行僵尸工具。 – Richard

回答

5

您的问题的可能怀疑是自动发布变量。他们是鬼鬼祟祟的人,没有你明确的释放他们就会被释放。所以请确保你没有使用autoreleased变量,并期待它继续存在。

至于你的具体问题,你实际上并不关心dealloc的调用栈。当你释放某些东西时,永远不会调用dealloc。对象的实际解除分配由应用程序的正常运行循环上下文之外的运行时处理,因此在此时查看调用堆栈将告诉您什么都没有。

你在乎的是release。如果你想知道你的对象何时被释放,你可以覆盖感兴趣的对象中的释放,并直接调用超级的实现。然后您可以在那里设置一个断点,以便在发布时查看当前的调用堆栈。为了清楚起见,应该是这样的:

- (oneway void)release { 
    [super release]; // Put a breakpoint here. 
} 

只是要注意:您可能会看到更多的版本比您预期。这是因为系统会很频繁地在内部保留和释放类,因此在确定哪些版本实际值得注意时需要谨慎使用。这种方法只是一个粗略的工具。 NSZombies对于追踪过度释放的对象也非常有用。

+0

神奇的解释。我早些时候使用过nszombies,但它在这个问题上没有帮助。发布暂停像一个魅力。 – BankStrong