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

标签 objective-c pointers lua selector

我正在尝试将 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/

相关文章:

objective-c - 管理 objective-c 中 NSError 的错误代码列表

c++ - 如何设置一个字符串数组,其中包含将通过数组显示在 iphone 文本上的字符串?

lua - 为什么 Lua 报告这个库是从源代码编译的 "The specified procedure could not be found."?

c - 字符指针遇到问题

c - 如何更改特定内存地址中的值?

c - 正确处理 Lua 绑定(bind) C 代码中的 malloc 调用

lua - 我如何才能在 Awesome wm 3.5 版中只有任务列表中的应用程序图标?

iOS 6 无法检查仅包含字母数字字符的字符串

objective-c - 如何在代码中将 uiview 的自定义子类作为 subview 添加到 uiview 的另一个自定义子类中?

c - C 中带有指针的结构体的简单求和