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