dealloc从哪里开始?

时间:2011-08-24 20:03:37

标签: iphone objective-c

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

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

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

1 个答案:

答案 0 :(得分:5)

可能怀疑您的问题是自动释放的变量。它们是偷偷摸摸的,没有你明确释放它们就会被释放。因此,请确保您没有使用自动释放的变量,并希望它能够坚持下去。

至于你的具体问题,你实际上并不关心dealloc的调用堆栈。当你释放某些东西时,dealloc永远不会被称为正确。对象的实际解除分配是由应用程序的正常运行循环上下文之外的运行时处理的,因此在该点查看调用堆栈将完全没有任何信息。

你关心的是release。如果你想知道你的对象何时被释放,你可以覆盖感兴趣的对象中的释放,并简单地调用super到super的实现。然后,您可以在那里设置断点,以便在发布时查看当前的调用堆栈。为清楚起见,它看起来像这样:

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

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