Ребята из C ++ и Java всегда говорят мне, что исключения не будут стоить никакой производительности, если их не выбросить. То же самое верно для Objective-C?
Короткий ответ
Только в 64-битной OS X и iOS.
Они не совсем бесплатны. Чтобы быть более точным, модель оптимизирована для минимизации затрат при регулярном выполнении (перемещение последствий в другом месте).
Подробный ответ
В 32-битных OS X и iOS исключения имеют стоимость времени выполнения, даже если они не выбрасываются. Эти архитектуры не используют исключения нулевой стоимости.
В 64-битной OS X ObjC перешел к заимствованиям C ++ «Исключения нулевой стоимости». Исключения с нулевой стоимостью имеют очень очень низкие накладные расходы на выполнение, , если не выдано . Исключения нулевой стоимости эффективно переводят стоимость выполнения в двоичный размер. Это было одной из основных причин, почему они изначально не использовались в iOS. Включение исключений C ++ и RTTI может увеличить размер двоичного файла более чем на 50% - конечно, я ожидал бы, что эти числа будут намного ниже в чистом ObjC просто потому, что при размотке будет меньше выполнения.
В arm64 модель исключения была изменена с Set Jump Long Jump на Исключения нулевой стоимости, полученные из Itanium (судя по сборке).
Однако Идиоматические программы ObjC не написаны и не готовы к восстановлению после исключений , поэтому вы должны зарезервировать их для ситуаций, из которых вы не собираетесь восстанавливаться (если вы решите их использовать вообще) , Более подробная информация содержится в руководстве Clang для ARC и в других разделах указанной страницы.