Я слышал, что понятие @throw дорого стоит в Objective-C, в чем причина этого? Is throw
в Java тоже дорого?Почему @throw в Objective-C - дорогостоящая операция?
ответ
«Исключение в 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»
Современная 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
просто просачиваются. Есть способы кодировать вокруг этого, но это очень сложно и подвержено ошибкам, и поэтому на практике это неразумно.
- 1. Самая дорогостоящая операция сортировки
- 2. Is File.Exists - дорогостоящая операция?
- 3. открывает файл поток дорогостоящая операция
- 4. Executors.newFixedThreadPool() - насколько это дорогостоящая операция
- 5. RabbitMQ создать соединение - это дорогостоящая операция
- 6. От запроса к списку, это дорогостоящая операция?
- 7. Какова самая дорогостоящая операция на JVM?
- 8. Операция "Throw NULL" в C
- 9. Это дорогостоящая операция для доступа к данным, хранящимся в NSUserDefaults?
- 10. Это дорогостоящая операция по созданию объектов модели данных IOS Core?
- 11. Агрегационная структура - Групповая операция throw NumberFormatException
- 12. NSString вопрос в ObjectiveC
- 13. Почему System.Web.Hosting.ApplicationHost.CreateApplicationHost throw System.IO.FileNotFoundException?
- 14. Почему cmd.executeNonQuery() throw ManagedDataAccess.Client.OracleException?
- 15. Почему nodeExists() throw BackingStoreException
- 16. Почему XDocument.Parse throw NotSupportedException?
- 17. Почему hasExited throw 'System.ComponentModel.Win32Exception'?
- 18. Наименее дорогостоящая операция по проверке новых записей в таблице с EF
- 19. Почему метод throw вместо возврата null?
- 20. Почему `Pattern.compile (" (?: \ U00e9) ", Pattern.CANON_EQ)` throw?
- 21. Почему нет Task.WaitAny throw exception?
- 22. Почему Moq throw Исключение TargetParameterCount
- 23. performSelector throw недопустимый аргумент, почему?
- 24. Почему операция добавления быстрее, чем операция умножения?
- 25. Почему `throw` недействителен в функции ES6 arrow?
- 26. Почему я вижу THROW в библиотеке C?
- 27. Почему операция TransactionScope недействительна?
- 28. ObjectiveC NSURLSessionDownloadTask
- 29. Объединить строки в ObjectiveC
- 30. Передача переменных в ObjectiveC
Начните с [этого ответа] (http://stackoverflow.com/a/324805/581190), чтобы узнать больше. – robertvojta
Зачем вам нужно знать? –
Ссылка от @robertvojta - отличная отправная точка. Исключения в Objective-C действительно таковы: исключения. Я бы поспорил, многие программисты не используют их много, если вообще. Поскольку они предназначены для улавливания ошибок в программировании, часто возникают упрощенные конструкции, такие как NSAssert, чтобы выполнить эту работу. – Eiko