簡體   English   中英

為什么Objective-C中的“ try catch”會導致內存泄漏?

[英]Why does “try catch” in Objective-C cause memory leak?

我在考慮在Objective-C中Try-Catch的優缺點。 根據這篇文章, 消除iOS中的NSException神話:我們可以使用@ try…@ catch,@ finally嗎? ,try-catch並沒有那么糟糕,除了它會泄漏ARC中的內存。

那么try-catch如何導致內存泄漏?

首先:異常在Objective-C中具有不同的語義。 異常表示由於編程錯誤而導致某些事情完全出錯,並且進一步執行該應用程序無用。 終止它! 要處理“預期的錯誤”(例如用戶輸入不足或服務器沒有響應等),請使用Cocoa的錯誤處理模式 (這樣做的原因是,在許多情況下異常似乎很方便,但在其他情況下(即在對象構造時)很難處理。請閱讀C ++中的異常。這很痛苦。)

問:ARC添加了其他代碼來處理內存管理。 必須執行此代碼來處理內存管理,尤其是。 釋放對象。 如果在此之前發生異常,則控制流將永遠不會到達release語句。 內存泄漏。

- (void)method
{
   id reference = …;
   // Some ARC code to retain the object, reference points to.
   … 
   @throw …
   …
   // reference loses its extent, because of method termination
   // Some ARC code to release the object, reference points to.
}

如果有異常,則該方法將立即保留,並且永遠不會執行ARC代碼以及該方法的結尾以釋放對象。 這就是泄漏。

您可以通過使用-fobjc-arc-exceptions選項編譯源來更改此行為。

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#exceptions

這將添加代碼以使ARC異常安全,從而導致運行時損失。 但是,正如該答案開頭所解釋的,在可可粉開發中沒有理由這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM