我正在尝试将 Lua 与 Objective-C 连接起来,我认为使用 NSSelectorFromString()
进行字符串转换的开销太大,因为 Lua 必须复制所有字符串才能将它们内部化(尽管我我对此不确定)。
所以我试图找到更轻量级的方式来表示 Lua 中的选择器。 Objective-C 选择器是一种抽象类型,但它被定义为指向某物的指针:
typedef struct objc_selector *SEL;
所以作为常规指针处理看起来很安全,所以我可以使用 lightuserdata
将它传递给 Lua。这样可以吗?
最佳答案
我认为将它作为指针(即使是 void
指针)来处理是不安全的,因为如果这在未来的实现或语言的不同实现中发生变化。我没有看到一个正式的 Objective-C 规范来说明什么是实现定义,但通常当使用像这样的不透明类型时,这意味着您不必知道有关底层类型的详细信息。事实上,该结构是前向声明的,因此您无法访问它的任何成员。
您可能遇到的另一个问题是实现相等性比较:选择器是对常量池的引用还是每个选择器都是可变的。再次定义实现。
按照上面的建议使用 C 字符串可能是您最好的选择; ruby 设法为选择器使用符号并且没有太多的性能损失。由于字符串是 const
,lua 不需要复制它们,但为了安全起见可能还是会复制它们。如果您能找到一种不复制字符串的方法,您可能不会受到太大的性能影响。
关于objective-c - 我可以假设并处理 Objective-C 中的 SEL 作为指向某物的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437649/