Безопасная обработка пользовательского кода Objective C из базы кода C

Позвольте мне сначала сказать, что у меня очень ограниченные знания в программировании на языке C.

У меня есть исполняемый файл C, который вызывает пользовательскую функцию, написанную в Objective C.

При условии, что что- либо может произойти в пользовательском коде, каков будет лучший способ безопасно обернуть код, чтобы функция C возвращала изящно?

В оболочке C++ я написал бы функцию, пытающуюся перехватить все исключения, чтобы исключить распространение исключения C++ в код C, где поведение не определено стандартом C.

Я полагаю, что сначала я должен предотвратить пересечение границ языка любым исключением ObjC (т. Е. Распространяться в код C), поэтому я бы написал обертку наподобие:

void objc_wrap(void) {
    @try {
        obj_entry();
    }
    @catch (NSException *ex) {
        // handle NSException
    }
    @catch (...) {
        // handle the rest
    }
}

Однако мое ограниченное знание языка не говорит мне, существуют ли другие механизмы, которые заставили бы пользовательский код пересекать границу модуля и вызывать неопределенное исключение.

Кроме того, необходима ли какая-либо инициализация / очистка среды выполнения Objective C перед вызовом пользовательской функции, при условии, что точка входа - чистый C?

Примечание. Сигналы и exit() обрабатывать не нужно, поскольку обертка запускается в разветвленном процессе.

1 ответ

Решение

Кажется, действительно, @try/catching пользовательская функция - лучший способ предотвратить ее пересечение языковых границ. В качестве бонуса любые исключения C++ также перехватываются @catch (...) предложение, поэтому не должно быть никаких проблем, если код Objective-C вызывает функции C++.

Другие вопросы по тегам