1

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

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

4

3 回答 3

3

当您希望调用该-dealloc方法时,并不总是调用该方法。运行时也可能-retain出于内部原因在您的对象上发布了一个。

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

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

什么时候调用dealloc方法的答案可以帮助您了解您所看到的。

于 2013-04-22T06:52:21.230 回答
0

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

所有 Objective-C 对象都在堆上分配,因此如果您不想耗尽资源,就必须在某处释放它们。

这让位于今天仍在使用的引用计数方法:每个对象都保留对其持有的任何引用的计数。如果您收到一个对象并且想要保留它,则保留该对象,并增加其引用计数。当你完成它时,你释放它,这会减少它的引用计数。一旦该计数达到零,则推断没有人引用该对象,并使用 -dealloc 方法自动释放该对象。

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

当池对象被释放时,它只是简单地向所有分配给它的对象发送一个-release 消息。这样,任何不再使用的对象(即它们没有被显式保留)都会被释放。

于 2013-04-22T07:03:58.240 回答
-1

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

@interface myViewController:UIViewController
{
    NSString *myStr;
}

@end

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

尽管如果您使用 ARC,则不必使用。

于 2013-04-22T06:55:52.557 回答