[英]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.