Исключения в 64-разрядных исполнимых программах

Время выполнения Objective C повторно реализовало механизм исключения для 64-разрядных исполнимых программ для обеспечения стоивший нулем @try блоки и функциональная совместимость с исключениями C++.

Стоившие нулем блоки @try

64-разрядные процессы, вводящие стоивший нулем @try блок не подвергается никакой потере производительности. Это непохоже на вызывающий механизм для 32-разрядных процессов, setjmp() и выполняет дополнительный «бухгалтерский учет». Однако выдача исключения является намного более дорогой в 64-разрядных исполнимых программах. Для лучшей производительности в 64-разрядном необходимо выдать исключения только при необходимости.

Функциональная совместимость C++

В 64-разрядных процессах, исключения Objective C (NSException) и исключение C++ является взаимодействующим. В частности, деструкторы C++ и Objective C @finally когда механизм исключения раскручивает исключение, блоки соблюдают. Кроме того, значение по умолчанию ловят пункты — т.е. catch(...) и @catch(...)— может поймать и повторно бросить любое исключение

С другой стороны, пункт выгоды Objective C, берущий объект исключения с динамическим контролем типов (@catch(id exception)) может поймать любое исключение Objective C, но не может поймать исключения C++. Так, для функциональной совместимости использовать @catch(...) поймать каждое исключение и @throw; повторно бросить перехваченные исключительные ситуации. В 32-разрядном, @catch(...) имеет тот же эффект как @catch(id exception).