2013-05-30 100 views
1

我有很多的方法是这样的:我真的需要atexit_b吗?

-(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的初衷是做一个好公民,在申请结束:)之前释放刚刚使用的内存。然而,据我所知,在运行时将重新收集所有的记忆,当我的应用程序退出(或终止等)反正。

可我总以为这?或者也许它取决于OS /运行时/一些实现?

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

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

回答

1

有 - 据我可以看到 - 使用atexit_b()主要有两个原因;

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

  • 你需要的半独立资源清理,以特定的顺序执行。 atexit_b()以相反的顺序清理事物已注册,因此如果您需要步进电机在旋转器电机断电前停放硬盘磁头,则可以使用它。

在你的情况下,它应该是一样安全地删除,除非另一个清理方法上theObject清理期间返回null计数。