【发布时间】:2011-08-17 12:53:11
【问题描述】:
在 Objective C 中创建自定义类时,何时以及如何调用 dealloc 方法?这是我必须在课堂上以某种方式实现的东西吗?
【问题讨论】:
标签: objective-c dealloc
在 Objective C 中创建自定义类时,何时以及如何调用 dealloc 方法?这是我必须在课堂上以某种方式实现的东西吗?
【问题讨论】:
标签: objective-c dealloc
您永远不会直接发送 dealloc 消息。相反,对象的 dealloc 方法是通过释放 NSObject 协议方法间接调用的(如果释放消息导致接收者的保留计数变为 0)。有关使用这些方法的更多详细信息,请参阅内存管理编程指南。
子类必须实现自己的 dealloc 版本,以允许释放对象消耗的任何额外内存——例如为数据动态分配的存储空间或被释放对象拥有的对象实例变量。在执行特定类的释放后,子类方法应该通过向 super 发送消息来合并超类版本的 dealloc:
重要提示:请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时自动清除——它更有效 只是为了让操作系统清理资源而不是调用所有内存 管理方法。由于这个原因和其他原因,您不应该管理稀缺资源 解除分配
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc];
}
}
【讨论】:
想象-release 在 NSObject 中是这样实现的:
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc]
}
}
我确信它比这更复杂一些,但您的问题的答案是,当对象的保留计数降至零时,对象本身将调用 -dealloc。但是,您的自定义类将从 NSObject 继承此行为。您永远不需要在自己编写的代码中调用 -dealloc;当对象被正确释放时,它总是会自动发生。
【讨论】:
dealloc 作为memory management 的结果被调用。一旦对象“retainCount”达到 0,就会自动向该对象发送一条 dealloc 消息。
你不应该对对象调用 dealloc,除非它是在被覆盖的 dealloc 结束时调用 [super dealloc];。
-(void)dealloc
{
[ivar release]; //Release any retained variables before super dealloc
[super dealloc]; //Only place in your code you should ever call dealloc
}
并根据-[NSObject dealloc] discussion
您永远不会直接发送 dealloc 消息。相反,一个对象的 dealloc 方法是通过释放 NSObject 间接调用的 协议方法(如果发布消息导致接收者的 保留计数变为0)。见Memory Management Programming Guide 有关这些方法的使用的更多详细信息。
【讨论】:
当不再需要对象时,运行时会为您执行此操作(运行时也会决定)。只要确保你正确地保留和释放。不要在其他对象上调用 dealloc。
【讨论】: