为什么Objective-C中的"try catch"导致内存泄漏?

 狗狗狗699_250 发布于 2022-12-09 16:25

我正在考虑Objective-C中Try-Catch的优缺点.根据这篇文章在iOS中消除NSException神话:我们可以使用@ try ... @ catch,@finally?,try-catch并不是那么糟糕,除了它在ARC中泄漏内存.

那么try-catch如何导致内存泄漏?

1 个回答
  • 首先:例外在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异常安全,从而导致运行时损失.但正如在这个答案的开头所解释的那样,在Cocoa开发中几乎没有理由这样做.

    2022-12-11 02:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有