我听说@throw的概念在Objective-C中很昂贵,背后的原因是什么? Java中的throw
也是昂贵的吗?
答案 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"
答案 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
块内的所有强引用都会泄漏。有一些方法可以对其进行编码,但它非常复杂且容易出错,因此在实践中是不明智的。