gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 11:01:21 25 4
gpt4 key购买 nike

我正在考虑在 Objective-C 中使用 Try-Catch 的优缺点。根据这篇文章 Dispelling NSException Myths in iOS: Can We Use @try…@catch, @finally?,try-catch 并没有那么糟糕,除了它会在 ARC 中泄漏内存。

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

最佳答案

首先:异常在 Objective-C 中有不同的语义。异常意味着由于编程错误而出现完全错误并且应用程序的进一步执行没有用。终止它!要处理“预期错误”(如用户输入不足或服务器无响应等),请使用 Cocoa's error handling pattern . (原因是异常在很多情况下看起来很方便,但在其他情况下很难处理,例如 while 对象构造。阅读 C++ 中的异常。这很痛苦。)

对于您的问题:ARC 添加了额外的代码来处理内存管理。必须执行此代码来处理内存管理,尤其是。释放物体。如果在完成此操作之前发生异常,则控制流永远不会到达发布语句。内存泄漏。

- (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 开发中没有理由这样做。

关于ios - 为什么Objective-C中的 "try catch"会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com