Catch Exception 導(dǎo)致內(nèi)存無法釋放

跟Java一樣,Objective-C也有自己的捕獲異常的方法。

try-catch語法

雖然iOS有捕獲異常的方法,但是實際開發(fā)中,大家用的是非常少,因為這套機(jī)制比較弱,能捕獲到都是容易發(fā)現(xiàn)的異常,而且蘋果文檔也強(qiáng)調(diào)開發(fā)者應(yīng)該做好邏輯檢查,而不是依賴try-catch,所以iOS開發(fā)者使用這方法的頻率遠(yuǎn)比Java開發(fā)者低很多。不過這些都是題外話,下面講講在ARC下,try-catch導(dǎo)致對象內(nèi)存無法釋放的情況。

我寫了捕獲unrecognized selector 異常的方法,如下所示:


unrecognized selector sent to instance

由于obj是NSObject對象,[obj integerValue] 會拋出 unrecognized selector sent to instance 的異常。然后進(jìn)入@catch的代碼塊,處理異常處理,但是此時obj不會再被釋放了。

因為在ARC釋放obj的代碼執(zhí)行之前,已經(jīng)發(fā)生了exception,進(jìn)入異常處理,這個時候是不會恢復(fù)到異常前的狀態(tài)去,所以這個對象也就無法釋放了。在蘋果看來,如果發(fā)生異常了,說明代碼有嚴(yán)重的錯誤,這個時候就應(yīng)該直接停止程序了。

那么要怎么辦呢?就是在文件的編譯選項加上-fobjc-arc-exceptions,這樣就可以啟動ARC處理異常情況下的內(nèi)存管理代碼,也就可以保證異常中ARC管理的對象也不會發(fā)生內(nèi)存泄漏。蘋果不鼓勵這樣做除了有上面說,還有就是因為加上-fobjc-arc-exceptions,會生成大量使用頻率很低的代碼(只有在異常情況才會執(zhí)行)。

除了-fobjc-arc-exceptions之外,還有-fno-objc-arc-exceptions。-fno-objc-arc-exceptions就是關(guān)閉ARC異常情況下管理對象內(nèi)存的功能。另外要注意Objective-C++文件, -fobjc-arc-exceptions默認(rèn)就是開啟的。

參考鏈接:
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#exceptions
why-does-try-catch-in-objective-c-cause-memory-leak

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存,也就是說,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,741評論 1 3
  • 來自網(wǎng)絡(luò) 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會...
    用心在飛閱讀 931評論 5 4
  • OC的理解與特性O(shè)C作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 580評論 0 0
  • 膠原蛋白對皮膚的作用 膠原蛋白作為一個少數(shù)人知曉的物質(zhì),對皮膚的美容養(yǎng)顏確實有著不俗的功效,它是一種高分子蛋白質(zhì),...
    兵頭將尾閱讀 219評論 0 0

友情鏈接更多精彩內(nèi)容