在Objective C中创建自定义类时,调用dealloc
方法的时间和方式是什么?这是我必须在课堂上以某种方式实现的吗?
答案 0 :(得分:17)
您永远不会直接发送dealloc消息。相反,通过释放NSObject协议方法间接调用对象的dealloc方法(如果释放消息导致接收者的保留计数变为0)。有关使用这些方法的详细信息,请参阅“内存管理编程指南”。
子类必须实现自己的dealloc版本,以允许释放对象消耗的任何额外内存 - 例如动态分配的存储空间,用于释放对象所拥有的数据或对象实例变量。在执行特定于类的释放后,子类方法应该通过消息将dealloc的超类版本合并到super:
重要说明:请注意,当应用程序终止时,可能不会向对象发送dealloc 消息,因为进程的内存在退出时自动清除 - 它更有效 只是允许操作系统清理资源而不是调用所有内存 管理方法。由于这个原因和其他原因,你不应该管理稀缺的资源 的dealloc
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc];
}
}
答案 1 :(得分:5)
想象一下-release
在NSObject中实现如下:
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc]
}
}
我确定它比这复杂一点,但你的问题的答案是,当它的保留计数降到零时,对象本身会调用-dealloc
。但是,您的自定义类将从NSObject继承此行为。你永远不需要在你编写的代码中调用-dealloc;当对象被正确释放时,它总会自动发生。
答案 2 :(得分:2)
dealloc
被调用。一旦对象“retainCount”达到0,则会自动将dealloc消息发送到该对象。
除非在重写的dealloc结束时调用[super dealloc];
,否则不应该在对象上调用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消息。相反,一个对象 通过发布NSObject间接调用dealloc方法 协议方法(如果释放消息导致接收者的 保留计数变为0)。请参阅Memory Management Programming Guide 关于使用这些方法的更多细节。
答案 3 :(得分:1)
当不再需要该对象时(运行时也决定该对象),运行时将为您执行此操作。只需确保正确保留和释放。不要在其他对象上调用dealloc。