美文网首页
iOS开发ARC、MRC不捕获异常的原因

iOS开发ARC、MRC不捕获异常的原因

作者: 晨阳Xia | 来源:发表于2020-11-10 20:30 被阅读0次

MRC手动管理引用计数时

   @try {
            EOCSomeClass *object = [[EOCSomeClass alloc] init];
            [object doSomethingThatMayThrow];
            [object release]
   }
  @catch(...){
           NSLog(@"Whoops, there was an error. Oh well...")
  }
乍一看上去似乎没有问题,但如果doSomethingThatMayThrow抛出异常了呢?由于异常会令执行过程终止并跳出catch块,因而其后的那行release代码不会运行。在这种情况下,如果代码抛出异常,那么对象就泄漏了。这么做不好。解决办法使用@finally块,无论是否抛出异常,其中的代码都会保证运行,且只运行一次。代码可更改为:
    @try {
             EOCSomeClass *object = [[EOCSomeClass alloc] init];
             [object doSomethingThatMayThrow];
    }
   @catch(...){
            NSLog(@"Whoops, there was an error. Oh well...")
   }
   @finally {
           [object release]
   }
注意,由于@finally块也引用object对象,所以必须把它从@try块里移到外面去。如果@try逻辑非常复杂,含有多条语句,那么很容易就会因为忘记某个对象而导致内存泄漏

在ARC环境下

    @try {
             EOCSomeClass *object = [[EOCSomeClass alloc] init];
             [object doSomethingThatMayThrow];
    }
   @catch(...){
            NSLog(@"Whoops, there was an error. Oh well...")
   }
由于ARC中不能调用release,所以无法像MRC手动管理引用计数那样把释放操作移到@finally块中。你可能认为这种情况ARC自然会处理。但实际上不会自动处理,因为这样做需要加入大量样板代码,以便跟踪待清理的对象,从而抛出异常是将起释放。可是,这段代码会严重影响运行期的性能,即便在不抛出异常时也是如此。而且添加进来的额外代码还会明显增加应用程序的大小。这些副作用都不甚理想。
虽然默认状况下未开启,但ARC依然能生成这种安全处理异常所用的附加代码。-fobjc-arc-exception 这个编译标志用来开启此功能。其默认不开启的原因是:在Objective-C代码中,只有应用程序必须因异常状况而中止是才应抛出异常。因此,如果应用程序即将终止,那么是否还会发生内存泄漏就已经无关紧要了。在应用程序必须立即终止的情况下,还去添加安全处理异常所用的附加代码是没有意义的。

相关文章

  • iOS开发ARC、MRC不捕获异常的原因

    MRC手动管理引用计数时 乍一看上去似乎没有问题,但如果doSomethingThatMayThrow抛出异常了呢...

  • 内存管理

    重要笔记 ARC中不捕获异常的原因! MRC中不捕获异常的原因! 第 29 条 理解引用计数 引用计数的工作原理 ...

  • iOS内存管理相关知识点

    iOS 开发:彻底理解 iOS 内存管理(MRC、ARC)[https://www.jianshu.com/p/4...

  • iOS 底层 day25 内存管理 MRC copy

    一、MRC 1. MRC基本介绍 现在我们 iOS 开发都在使用 ARC,基本上不会使用 MRC,那为什么我们还要...

  • ARC和MRC

    笔者开始自学iOS的时候是MRC的,不久便接触了ARC。 下面介绍一下我所理解的MRC和ARC: ARC和MRC的...

  • 内存管理

    OC知识--彻底理解内存管理(MRC、ARC) IOS工程中混合使用ARC与MRC iOS 简单而粗暴的说一说内存...

  • iOS 开发:iOS内存管理分析

    前言 本篇博客手动 copy 自 iOS 开发:彻底理解 iOS 内存管理(MRC、ARC)。谢谢原作者的详细分析...

  • iOS 知识点(6)修饰词

    iOS属性中常用修饰词的总结 一、assign (ARC/MRC) 1、assign在ARC和MRC中都是存在的2...

  • MRC,ARC混编环境配置

    MRC --- ARC(让ARC文件在MRC的环境下进行ARC编译) -fobjc-arc ARC --- MRC...

  • IOS 捕获异常工具UncaughtExceptionHandl

    原文IOS 捕获异常工具UncaughtExceptionHandleriOS程序异常Crash友好化处理 开发i...

网友评论

      本文标题:iOS开发ARC、MRC不捕获异常的原因

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