Catch Exception 导致内存无法释放

跟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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,542评论 1 3
  • 来自网络 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会...
    用心在飞阅读 847评论 5 4
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 536评论 0 0
  • 胶原蛋白对皮肤的作用 胶原蛋白作为一个少数人知晓的物质,对皮肤的美容养颜确实有着不俗的功效,它是一种高分子蛋白质,...
    兵头将尾阅读 194评论 0 0