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

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

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

首先:Objective-C中的exception具有不同的语义。 例外意味着由于编程错误而导致某些事情完全错误,并且应用程序的进一步执行没有用处。 终止它! 为了处理“预期的错误”(如用户input不足或者没有响应服务器等),使用Cocoa的error handling模式 。 (其原因是在很多情况下,exception似乎很方便,但是在其他情况下很难处理,也就是在构build对象的时候,在C ++中读取exception,这是很痛苦的。

给你的问:ARC增加了额外的代码来处理内存pipe理。 这个代码必须被执行来处理内存pipe理,尤其是 释放对象。 如果在完成之前发生exception,则控制stream程永远不会到达发布语句。 内存泄漏。

- (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. } 

如果你有一个exception,那么这个方法就会立即离开,ARC代码和释放对象的方法结束将不会被执行。 这是泄漏。

您可以通过使用-fobjc-arc-exceptions选项编译源来更改此行为。

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#exceptions

这将添加代码以使ARCexception安全,从而导致运行时损失。 但是在Cocoa开发中没有什么理由这样做,正如本答案的开头所解释的那样。