为什么在Objective-C中使用@throw是一项昂贵的操作?

时间:2015-07-05 20:30:21

标签: objective-c

我听说@throw的概念在Objective-C中很昂贵,背后的原因是什么? Java中的throw也是昂贵的吗?

2 个答案:

答案 0 :(得分:3)

"目标C中的异常使用C原语实现: longjmp的()。 Objective-C不是C ++。您可能有多层方法 在引发异常的代码和方法之间调用 抓住它。编写内存泄漏非常容易。"

http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.mac.programmer.help/2007-08/msg00020.html

也...

"更多信息。

C ++异常,在现代ABI下,Objective-C异常是 设置非常便宜(@try),但对@throw和@catch来说很贵。

当@throw发生时,生成位的成本很高 正确解开堆栈所必需的。

不幸的是,AppKit存在导致展开信息的问题 作为其操作的正常部分生成(不抛出 除外)。

因此,64位的某些AppKit操作可能会非常慢 时间。

b.bum"

http://www.cocoabuilder.com/archive/cocoa/217947-cocoa-application-running-very-slow-under-64-bit.html

答案 1 :(得分:3)

现代Objective-C使用C ++异常。 there is a cost associated with throwing a C++ exception虽然在大多数情况下都不会让人望而却步。

Objective-C不使用异常的原因是因为内存管理。

Java和C ++等语言具有内置机制,可在抛出异常时处理内存管理。 Objective-C没有(除非你将所有东西都包装在C ++堆栈对象中)。

相反,当你在Objective-C中throw时,封闭的try块内的所有强引用都会泄漏。有一些方法可以对其进行编码,但它非常复杂且容易出错,因此在实践中是不明智的。