我已经使用alloc/init
方法创建了一个对象,在我发布它之后-dealloc
应该根据文档立即调用它。我在方法上设置了一个断点,-dealloc
但它没有被命中,我的-dealloc
方法也没有被调用。
请告诉我这背后的原因是什么,以及目标 c 中 dealloc 方法的用途是什么?
我已经使用alloc/init
方法创建了一个对象,在我发布它之后-dealloc
应该根据文档立即调用它。我在方法上设置了一个断点,-dealloc
但它没有被命中,我的-dealloc
方法也没有被调用。
请告诉我这背后的原因是什么,以及目标 c 中 dealloc 方法的用途是什么?
当您希望调用该-dealloc
方法时,并不总是调用该方法。运行时也可能-retain
出于内部原因在您的对象上发布了一个。
您也有可能(直接或间接)导致额外-retain
发行。如果保留/分配和释放不平衡,您将永远不会看到-dealloc
调用。它有助于打开静态分析器,以确保您的通话平衡。
只需遵循内存管理规则,不要猜测运行时,让内存管理系统完成它的工作。
什么时候调用dealloc方法的答案?可以帮助您了解您所看到的。
因为它仍然有参考。这意味着它的引用计数未达到零。我不知道你的代码,它在哪里引用。但它没有调用这意味着它仍然有参考。可能是因为强关系或亲子关系
所有 Objective-C 对象都在堆上分配,因此如果您不想耗尽资源,就必须在某处释放它们。
这让位于今天仍在使用的引用计数方法:每个对象都保留对其持有的任何引用的计数。如果您收到一个对象并且想要保留它,则保留该对象,并增加其引用计数。当你完成它时,你释放它,这会减少它的引用计数。一旦该计数达到零,则推断没有人引用该对象,并使用 -dealloc 方法自动释放该对象。
此外,可以使用自动释放池告诉对象“在(希望)不久的将来的某个时间点释放”。这个想法是在堆栈上的某个地方(通常在线程开始或响应输入事件时)创建自动释放池并将其推送到堆栈上。然后可以向任何对象发送 -autorelease 消息,并将其分配给该池。
当池对象被释放时,它只是简单地向所有分配给它的对象发送一个-release 消息。这样,任何不再使用的对象(即它们没有被显式保留)都会被释放。
每当您的dealloc
对象被释放时,都会调用(在更多情况下)。您不能直接调用此方法。
@interface myViewController:UIViewController
{
NSString *myStr;
}
@end
这里的dealloc
@implementation 中的方法将在对象被释放myViewController
时(在大多数情况下)被调用,而不是在被释放时。myViewController
myStr
尽管如果您使用 ARC,则不必使用。