我有很多像这样的方法:
-(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电话?
答案 0 :(得分:1)
据我所知,有两个主要原因使用atexit_b()
;
您需要清理/同步不一定可以终止的资源。作为一个“极端”的例子,如果您正在控制机器人,您可能希望在终止程序之前强制它停止移动。文字处理器可能希望确保保存的文件处于一致状态。当然,可能还有其他方法可以实现更安全。
您需要清理半独立资源,以便按特定顺序执行。 atexit_b()
按照相反的顺序进行清理,因此如果您需要步进电机在微调电机关闭之前停放硬盘磁头,您可以使用它。
在您的情况下,删除它应该同样安全,除非另一个清理方法依赖于在清理期间返回null的Object。