美文网首页
Catch Exception 导致内存无法释放

Catch Exception 导致内存无法释放

作者: AlanWong | 来源:发表于2017-07-13 11:57 被阅读484次

跟Java一样,Objective-C也有自己的捕获异常的方法。

try-catch语法

虽然iOS有捕获异常的方法,但是实际开发中,大家用的是非常少,因为这套机制比较弱,能捕获到都是容易发现的异常,而且苹果文档也强调开发者应该做好逻辑检查,而不是依赖try-catch,所以iOS开发者使用这方法的频率远比Java开发者低很多。不过这些都是题外话,下面讲讲在ARC下,try-catch导致对象内存无法释放的情况。

我写了捕获unrecognized selector 异常的方法,如下所示:


unrecognized selector sent to instance

由于obj是NSObject对象,[obj integerValue] 会抛出 unrecognized selector sent to instance 的异常。然后进入@catch的代码块,处理异常处理,但是此时obj不会再被释放了。

因为在ARC释放obj的代码执行之前,已经发生了exception,进入异常处理,这个时候是不会恢复到异常前的状态去,所以这个对象也就无法释放了。在苹果看来,如果发生异常了,说明代码有严重的错误,这个时候就应该直接停止程序了。

那么要怎么办呢?就是在文件的编译选项加上-fobjc-arc-exceptions,这样就可以启动ARC处理异常情况下的内存管理代码,也就可以保证异常中ARC管理的对象也不会发生内存泄漏。苹果不鼓励这样做除了有上面说,还有就是因为加上-fobjc-arc-exceptions,会生成大量使用频率很低的代码(只有在异常情况才会执行)。

除了-fobjc-arc-exceptions之外,还有-fno-objc-arc-exceptions-fno-objc-arc-exceptions就是关闭ARC异常情况下管理对象内存的功能。另外要注意Objective-C++文件, -fobjc-arc-exceptions默认就是开启的。

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

相关文章

  • Catch Exception 导致内存无法释放

    跟Java一样,Objective-C也有自己的捕获异常的方法。 虽然iOS有捕获异常的方法,但是实际开发中,大家...

  • iOS内存泄漏问题及解决方案

    内存泄漏 内存泄漏指的是程序中已动态分配的堆内存由于某些原因未能释放或无法释放,造成系统内存的浪费,导致程序运行速...

  • Java ThreadLocal可能引起的内存泄漏

    内存泄漏:内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或者无法释放,造成系统内存的浪费,导致程序运行...

  • iOS抛出异常,捕获异常

    @try { } @catch (NSException *exception) { } @finally { }

  • ios容易造成循环引用的场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • 循环引用问题

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • iOS容易循环引用的三种场景(转)

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的...

  • iOS集成flutter 进阶--02flutter内存释放

    本文不谈如何优化, 只说说如何保证内存的正常释放;<苦笑> 前段时间遇到 这哥仨相互引用的导致无法释放内存(也许只...

  • 内存泄漏分析(一)

    内存泄漏(memory leak),指程序在申请内存后,一直无法释放已申请的内存空间。内存泄露会消耗内存导致系统卡...

  • ThreadLocal如果使用不当造成内存泄漏

    内存泄露:指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至...

网友评论

      本文标题:Catch Exception 导致内存无法释放

      本文链接:https://www.haomeiwen.com/subject/kodwhxtx.html