当我释放特定对象时,不会调用Dealloc方法

时间:2013-04-22 06:46:50

标签: objective-c

我使用alloc/init方法创建了一个对象,在我发布之后,应该根据文档立即调用-dealloc。我在-dealloc方法上设置了一个断点,但它没有被命中,我的-dealloc方法没有被调用。

请告诉我这背后的原因是什么,以及目标c中dealloc方法的用途是什么?

3 个答案:

答案 0 :(得分:3)

当您希望调用-dealloc方法时,并不总是调用它。由于内部原因,运行时可能还会在您的对象上发出-retain

您也可能(直接或间接)导致额外-retain发布。如果保留/分配和释放不平衡,您将永远不会看到-dealloc被呼叫。它有助于打开静态分析器,以确保您的呼叫平衡。

只需遵循内存管理规则,不要再猜测运行时,让内存管理系统完成其工作。

When does dealloc method call?的答案可以帮助您了解您所看到的内容。

答案 1 :(得分:0)

因为它仍然有参考。这意味着它的引用计数未达到零。我不知道你的代码,它引用的位置。但它并没有调用那意味着它仍然有参考。可能是因为强烈关系或亲子关系

  

所有Objective-C对象都在堆上分配,因此它们必须   因此,如果你不用完,就要在某个地方解除分配   资源。

     

这让位于仍在使用的引用计数方法   今天:每个对象都会记录对它的任何引用。如果你   接收一个对象,你想保留它,你保留该对象,   递增其引用计数。当你完成它,你   释放它,减少其引用计数。一旦算上   达到零,推断出没有人引用该对象   它使用-dealloc方法自动释放。

     

此外,可以告诉某个对象“在某个时刻释放   (希望)将来“使用自动释放池”。这个想法就是这样   在堆栈的某个地方(通常在线程的开头或者同时   响应输入事件)创建并推送自动释放池   在堆栈上。然后可以向任何对象发送-autorelease消息,并且   它被分配到该池。

     

当池对象被释放时,它只是发送一个-release   消息到其所有已分配的对象。那样,任何没有的对象   那么长时间使用(即它们没有明确保留)   解除分配。

答案 2 :(得分:-1)

每当释放对象时,都会调用dealloc(在更多情况下)。您无法直接调用此方法。

@interface myViewController:UIViewController
{
    NSString *myStr;
}

@end

此处dealloc对象释放后,myViewController的@implementation中的myViewController方法将被调用(在大多数情况下),而不是myStr被释放时。

虽然您不必使用ARC。