我使用alloc/init
方法创建了一个对象,在我发布之后,应该根据文档立即调用-dealloc
。我在-dealloc
方法上设置了一个断点,但它没有被命中,我的-dealloc
方法没有被调用。
请告诉我这背后的原因是什么,以及目标c中dealloc方法的用途是什么?
答案 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。