首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么目标C中的“尝试捕捉”会导致内存泄漏?

为什么目标C中的“尝试捕捉”会导致内存泄漏?
EN

Stack Overflow用户
提问于 2014-11-26 03:34:24
回答 1查看 3.7K关注 0票数 12

我在考虑在目标C中尝试捕获的利弊。根据这篇文章,消除NSException在iOS中的神话:我们能使用@try…吗?@catch,“最后?”,“尝试-捕捉”不是那么糟糕,只是它泄露了ARC中的内存。

那么,试图捕获是如何导致内存泄漏的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 05:57:12

首先,在Objective中,异常具有不同的语义。异常意味着某些事情由于编程错误而完全出错,而应用程序的进一步执行是没有用的。终止它!处理“预期错误”(例如用户输入不足或没有响应服务器等)。使用可可的错误处理模式。(造成这种情况的原因是,异常在许多情况下似乎很方便,但在其他情况下,即对象构造时,很难处理。阅读C++中的异常。这是痛苦的。)

在Q: ARC中添加了额外的代码来处理内存管理。必须执行此代码来处理内存管理(尤其是内存管理)。释放物体。如果在此之前发生异常,则控制流永远不会到达exception语句。内存泄漏。

代码语言:javascript
运行
复制
- (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异常安全,从而导致运行时的损失。但是,在可可开发中,没有什么理由这样做,正如在这个答案的开头所解释的那样。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27140891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档