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

ios objective-c memory-leaks error-handling try-catch

2246 观看

1回复

719 作者的声誉

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

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

作者: allenlinli 的来源 发布者: 2014 年 11 月 26 日

回应 (1)


15

15058 作者的声誉

决定

首先:例外在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开发中几乎没有理由这样做。

作者: Amin Negm-Awad 发布者: 26.11.2014 05:57
32x32