1

我有很多这样的方法:

-(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,无论如何,当我的应用程序退出(或终止等)时,运行时将重新收集所有内存。

我可以一直假设吗?或者它可能取决于操作系统/运行时/某些实现?

在我的特殊情况下,我在应用程序周围有几个(比如说几十个)atexit_b调用,所以这意味着一些内存被用来做一些不需要的事情。

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

4

1 回答 1

1

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

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

  • 您需要清理半独立资源以按特定顺序执行。atexit_b()以相反的顺序清理东西被注册,所以如果你需要步进电机在旋转电机关闭之前停放硬盘磁头,你可以使用它。

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

于 2013-05-30T06:48:05.723 回答