2011-06-22 1 views
5

私はLuaをObjective-Cでインターフェイスしようとしていますが、NSSelectorFromString()の文字列変換にはあまりにも大きなオーバーヘッドがあると思います。なぜなら、Luaはすべての文字列を内部化するためです。Objective-CでSELを何かへのポインタとして想定して処理できますか?

私はLuaでセレクタを表現するためのより軽量な方法を探しています。 Objective-Cのセレクタは、抽象化のタイプですが、それが何かへのポインタとして定義されています:

typedef struct objc_selector *SEL; 

は、だから、通常のポインタとして扱うことは安全に見えるので、私はlightuserdataでのLuaにそれを渡すことができます。いいですか?

+2

C文字列を使用すると便利でしょうか? NSSelectorFromString()の代わりに 'sel_registerName()'を使うことができ、前者はCの文字列引数を受け取ります。それ以外の場合、Objective-CコードからLua/Cコードにセレクタを受け取っている場合は、 'SEL'を' void * 'として扱うことができます。 –

+0

面白いことに、SELは既にCの文字列へのポインタです...それを使用することを奨励したいとは思いません。 – JustSid

+0

SELはC文字列へのポインタですが、これは推奨されない実装の詳細です。 – Lothar

答えて

2

今後の実装や言語の異なる実装でこれが変更された場合は、それをポインタ(さらにはvoidポインタ)として扱うことは安全だとは思いません。私は、実装定義が何であるかを示す正式なObjective-C仕様を見ていませんでしたが、このような不透明な型を使用すると、基になる型の詳細を知る必要はないはずです。実際には、構造体は前方宣言されているため、メンバーにアクセスすることはできません。

他の問題は、等価比較を実装することです。セレクタは定数のプールへの参照か、各セレクタの変更が可能です。ここでもまた、実装が定義されています。

上記のようにCの文字列を使用するのがおそらく最適です。ルビはセレクタのシンボルを使用することを管理し、あまりパフォーマンスペナルティはありません。文字列はconstなので、luaはコピーするのににはが必要ではありませんが、おそらく安全であると思われます。あなたが文字列をコピーしない方法を見つけることができれば、それほどパフォーマンスのヒットを得ることはできません。

関連する問題