安全地处理来自 C 代码库的 Objective C 用户代码
Safely handle Objective C user code from a C codebase
首先声明我在Objective C编程方面的知识非常有限。
我有一个 C 可执行文件调用用 Objective C 编写的用户定义函数。
假定 任何事情 都可能在用户代码中发生,安全包装代码以便 C 函数 returns 优雅地运行的最佳方法是什么?
在 C++ 包装器中,我会编写一个函数来尝试捕获所有异常,以防止 C++ 异常传播到 C 代码中,其中行为未由 C 标准定义。
我想我应该首先防止任何 ObjC 异常跨越语言边界(即传播到 C 代码中),所以我会写一个像这样的包装器:
void objc_wrap(void) {
@try {
obj_entry();
}
@catch (NSException *ex) {
// handle NSException
}
@catch (...) {
// handle the rest
}
}
然而,我对语言的有限了解并没有告诉我是否有其他机制会使用户代码越过模块边界并导致未定义的异常。
此外,如果入口点是纯 C,调用用户函数之前是否需要 initialization/cleanup 的 Objective C 运行 时间?
注意:不需要处理信号和 exit(),因为包装器 运行 在分叉进程中。
看来,@try/catching 用户功能确实是防止它跨越语言界限的最佳方式。作为奖励,任何 C++ 异常也被 @catch (...)
子句捕获,因此如果 Objective-C 代码调用 C++ 函数应该没有任何问题。
首先声明我在Objective C编程方面的知识非常有限。
我有一个 C 可执行文件调用用 Objective C 编写的用户定义函数。
假定 任何事情 都可能在用户代码中发生,安全包装代码以便 C 函数 returns 优雅地运行的最佳方法是什么?
在 C++ 包装器中,我会编写一个函数来尝试捕获所有异常,以防止 C++ 异常传播到 C 代码中,其中行为未由 C 标准定义。
我想我应该首先防止任何 ObjC 异常跨越语言边界(即传播到 C 代码中),所以我会写一个像这样的包装器:
void objc_wrap(void) {
@try {
obj_entry();
}
@catch (NSException *ex) {
// handle NSException
}
@catch (...) {
// handle the rest
}
}
然而,我对语言的有限了解并没有告诉我是否有其他机制会使用户代码越过模块边界并导致未定义的异常。
此外,如果入口点是纯 C,调用用户函数之前是否需要 initialization/cleanup 的 Objective C 运行 时间?
注意:不需要处理信号和 exit(),因为包装器 运行 在分叉进程中。
看来,@try/catching 用户功能确实是防止它跨越语言界限的最佳方式。作为奖励,任何 C++ 异常也被 @catch (...)
子句捕获,因此如果 Objective-C 代码调用 C++ 函数应该没有任何问题。