Objective-C ARC と を混在させるためのベスト プラクティスは何longjmpですか?
スクリプト言語として Lua を使用しており、私のプラットフォームはスクリプト用のカスタム ライブラリをエクスポートしています。luaL_checkinteger(L, 2)エントリポイントは(とりわけ) で引数をチェックします。これは、 /luaL_typerror(L, 2, ...)で Lua に実装されている を呼び出すことができます。私の知る限り、ARC は単純に自動生成/コードを生成しますが、範囲外の場合はどうなりますか? このコードは、引数の入力ミスでリークしますか?setjmplongjmpretainreleaselongjmp
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;
}
上記の[潜在的な]リークは解決されますか? これを行うためのより良い方法はありますか?
更新: longjmpLua の内部にのみ巻き戻し、Lua ソース (認識されている) と私のエントリ ポイント (認識されていることを願っています) を除いて、システム コードを交差させることはありません。
2 番目のスニペットが正しいと確信していますが、正式な証明が必要です。
後期更新:
LuaJIT は dwarf2 互換のエラーを実装しているため、C++ の例外と同様です。Lua コードを使用してアーク対応ソースにコンパイラ フラグを渡す-fobjc-arc-exceptionsと、保持されているオブジェクトは任意の で解放されますlua_error。今、心配することは何もありません!ただし、Cocoa ランタイム全体でエラーをスローすることはまだ許可されていません。
元の Lua も例外付きでコンパイルされている可能性があることを思い出しますが、よくわかりません。