2013-04-22 68 views
1

我已经使用alloc/init方法创建了一个对象,并且在我释放它之后,应立即按文档调用-dealloc。我在-dealloc方法上设置了一个断点,但未命中,并且我的-dealloc方法未被调用。当我释放特定对象时,不会调用Dealloc方法

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

+0

http://stackoverflow.com/questions/559295/difference-between-release-and-dealloc-in-objective-c – Balu 2013-04-22 06:52:04

+3

请寄一些代码吗? – 2013-04-22 06:52:45

回答

3

当你期望它被调用时,并不总是调用-dealloc方法。由于内部原因,运行时也可能在您的对象上发布了-retain

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

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

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

-1

无论何时释放对象,都会调用dealloc(在更多情况下)。你不能直接调用这个方法。

@interface myViewController:UIViewController 
{ 
    NSString *myStr; 
} 

@end 

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

虽然你不必使用,如果你ARC。

0

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

所有Objective-C的对象是在堆上分配的,所以他们必须 因此在某个地方,如果你不跑出来的 释放资源。

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

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

当池对象被释放时,它只是发送一个“释放” 消息给其所有分配的对象。这样,任何没有 更长时间使用的对象(即它们没有被明确保留)然后解除分配 。

相关问题