将 Objective-C ARC 与 混合的最佳实践是什么longjmp
?
我使用 Lua 作为脚本语言,我的平台为脚本导出自定义库。入口点确实使用luaL_checkinteger(L, 2)
(以及其他)检查参数,这反过来可能会调用luaL_typerror(L, 2, ...)
,这是在 Lua 中使用setjmp
/实现的longjmp
。据我所知,ARC 只是自动生成retain
/release
代码,但是如果longjmp
超出范围会发生什么?此代码是否会因输入错误的参数而泄漏?
static int
set_tag(lua_State *L)
{
NSControl *control = (__bridge NSControl *)lua_topointer(L, 1);
[control setTag:(NSInteger)luaL_checkinteger(L, 2)]; // may longjmp!
return 0;
}
在上面的代码片段中,control
将被 ARC 临时保留,但具有longjmp
不可捕获的性质,相应的释放调用可能永远不会发生。另一方面,可以在分配给变量之前检查所有参数。control
static int
set_tag(lua_State *L)
{
NSInteger tag = luaL_checkinteger(L, 2); // may longjmp!
NSControl *control = (__bridge NSControl *)lua_topointer(L, 1);
[control setTag:tag];
return 0;
}
它是否解决了上面的[潜在]泄漏?有没有更好的方法来做到这一点?
更新:longjmp
只展开到 Lua 内部,从不跨越任何系统代码,除了 Lua 源(知道)和我的入口点(我希望知道)。
我很确定第二个片段是正确的,但我需要一种正式的证明。
最新更新:
LuaJIT 实现了与 dwarf2 兼容的错误,因此它们就像 C++ 异常一样。使用 Lua 代码将编译器标志传递-fobjc-arc-exceptions
给启用 arc 的源,并且任何保留的对象都将在任何lua_error
. 现在没什么好担心的!不过,您仍然不允许在 Cocoa 运行时抛出错误。
我记得原来的 Lua 也可能编译时有异常,但我不确定。