2015-07-05 2 views
3

Я слышал, что понятие @throw дорого стоит в Objective-C, в чем причина этого? Is throw в Java тоже дорого?Почему @throw в Objective-C - дорогостоящая операция?

+2

Начните с [этого ответа] (http://stackoverflow.com/a/324805/581190), чтобы узнать больше. – robertvojta

+0

Зачем вам нужно знать? –

+0

Ссылка от @robertvojta - отличная отправная точка. Исключения в Objective-C действительно таковы: исключения. Я бы поспорил, многие программисты не используют их много, если вообще. Поскольку они предназначены для улавливания ошибок в программировании, часто возникают упрощенные конструкции, такие как NSAssert, чтобы выполнить эту работу. – Eiko

ответ

3

«Исключение в Objective 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 возникла проблема, из-за которой сообщение должно быть сгенерировано как нормальная часть его работы (без исключения ).

Таким образом, некоторые операции AppKit в 64 бит могут быть довольно медленными при этом времени.

b.bum»

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

3

Современная Objective-C использует исключения C++. В то время как there is a cost associated with throwing a C++ exception, это вряд ли запретительные в большинстве случаев.

Причина исключения не используются с Objective-C является из-за управления памятью.

Языки, такие как Java и C++, имеют встроенные механизмы для управления памятью при возникновении исключения. Objective-C не (если вы не обертываете e все в объектах стека C++).

Вместо этого, когда вы throw в Objective-C, все сильные ссылки внутри прилагаемого блока try просто просачиваются. Есть способы кодировать вокруг этого, но это очень сложно и подвержено ошибкам, и поэтому на практике это неразумно.

Смежные вопросы