我真的需要atexit_b吗?

时间:2013-05-30 06:34:42

标签: objective-c c

我有很多像这样的方法:

-(NSObject *)theObject
{
    static NSObject *obj = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        obj = [[NSObject alloc] init];
        atexit_b (^{
            [obj release], obj = nil;
        });
    });
    return obj;
}

我认为使用atexit_b的最初目的是成为一个好公民并释放应用程序结束前使用的内存:)。但是,AFAIK,无论如何,当我的应用程序退出(或终止等)时,运行时将重新收集所有内存。

我可以一直假设这个吗?或者它可能取决于OS /运行时/某些实现?

在我的特定情况下,我在应用程序周围有几个(简称几十个)atexit_b个调用,因此这意味着需要使用一些内存来执行不必要的操作。

这是真的吗?如果是这样,那么这是否意味着我不需要atexit_b电话?

1 个答案:

答案 0 :(得分:1)

据我所知,有两个主要原因使用atexit_b();

  • 您需要清理/同步不一定可以终止的资源。作为一个“极端”的例子,如果您正在控制机器人,您可能希望在终止程序之前强制它停止移动。文字处理器可能希望确保保存的文件处于一致状态。当然,可能还有其他方法可以实现更安全。

  • 您需要清理半独立资源,以便按特定顺序执行。 atexit_b()按照相反的顺序进行清理,因此如果您需要步进电机在微调电机关闭之前停放硬盘磁头,您可以使用它。

在您的情况下,删除它应该同样安全,除非另一个清理方法依赖于在清理期间返回null的Object。