我能将Objective-C中的SEL视为指向某个东西的指针并进行处理吗?

我正在尝试将Lua与Objective-C接口化,我认为使用NSSelectorFromString()进行字符串转换开销太大,因为Lua必须复制所有字符串以内部化它们(虽然我不确定)。

因此,我正在尝试找到更轻量级的方法来在Lua中表示选择器。Objective-C选择器是一个抽象的类型,但它被定义为指向某个东西的指针:

typedef struct objc_selector    *SEL;

因此,它看起来像一个常规指针,所以我可以使用lightuserdata将其传递给Lua。这样可以吗?

原文链接 https://stackoverflow.com/questions/6437649

点赞
stackoverflow用户236457
stackoverflow用户236457

我认为作为指针(即使是 void 指针)来处理它是不安全的,因为如果在将来的实现或语言的不同实现中发生了更改,那么这可能会导致问题。我没有看到过一个正式的 Objective-C 规范来说明实现定义,但通常当使用像这样的不透明类型时,这意味着您不需要知道底层类型的详细信息。事实上,结构是前向声明的,以便您无法访问其任何成员。

你可能会遇到的另一个问题是实现相等比较:选择器是否是常量池的引用,或者每个选择器是否可变。同样,这也是实现定义的。

如上所述,使用 C 字符串可能是您最好的选择;Ruby 使用符号来表示选择器,并不会有太大的性能损失。由于字符串是 const 的,因此 Lua 不需要复制它们,但可能会出于安全起见复制它们。如果您可以找到一种不复制字符串的方法,则可能不会降低太多性能。

2011-06-22 16:34:05