2013-05-30 134 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計數。