我可以假设和处理Objective-C中的SEL作为指向某事物的指针吗?

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.这样好吗?

RC *_*owe 2

我不认为将其作为指针(甚至是指针void)处理是安全的,因为如果这在未来的实现或语言的不同实现中发生变化。我没有看到正式的 Objective-C 规范来说明什么是实现定义,但通常当使用像这样的不透明类型时,这意味着您不必了解有关底层类型的详细信息。事实上,该结构是前向声明的,因此您无法访问其任何成员。

您可能遇到的另一个问题是实现相等比较:选择器是对常量池的引用还是每个选择器都是可变的。再次定义实现。

按照上面的建议使用 C 字符串可能是您最好的选择;ruby 设法使用符号作为选择器,并且没有太多的性能损失。由于字符串是const,lua 不需要复制它们,但为了安全起见可能会复制它们。如果您能找到一种不复制字符串的方法,您可能不会受到太大的性能影响。