objective-c - Objective-C 选择器在哪里注册/存储?

标签 objective-c selector objective-c-runtime dispatch-table

我不太了解 Objective-C 选择器。 问题是:Objective-C 选择器存储在哪里?

Objective-C 编译器和运行时系统如何工作,以便将方法名称转换为 SEL?

最佳答案

选择器是“内部”(唯一)字符串。运行时维护一个内部字符串(选择器)池。如果你想实习一个字符串,你可以使用 C 字符串调用 sel_getUid()sel_registerName() 运行时函数,它会返回一个不透明的 SEL(选择器)。如果该字符串之前已被实习过,则此选择器保证与前一个相同。相反,从选择器中,您可以使用 sel_getName() 取回字符串。在 Cocoa 中,您将使用 NSSelectorFromString()NSStringFromSelector(),它们对 NSString 对象进行操作,而不是使用上述低级运行时函数.

大多数时候,您不会在程序中间进行字符串和选择器之间的转换。相反,选择器在编译时已经被硬编码。当您执行像 [foo something: bar] 这样的方法调用时,它会被编译成像 objc_msgSend(foo, @selector(something:), bar) 这样的东西,并且像 @selector(something:) 这样的选择器文字将被编译为对编译器生成的二进制选择器表的引用,类似于全局变量。当一个模块被链接时,它的选择器表与主程序的选择器表合并,以保证选择器的唯一性。

关于objective-c - Objective-C 选择器在哪里注册/存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533711/

相关文章:

ios - 将另一个 ViewController 传递的值分配给字符串时出现问题

objective-c - 在遍历 NSDictionary 时处理不同的对象类型

objective-c - 如何摆脱 'undeclared selector' 警告

ios - 如何创建一个 "array of selectors"

objective-c - 寻找 iPhoneOS 中的 marg_setValue 修复

objective-c - 第二次启动 View Controller 后 Superview 为零

iphone - 在 iOS 7 中移动状态栏

jquery - 这在 jQuery 中合法吗?

iOS/Objective-C 元类和类别

iphone - 将应用程序静态链接到我自己的自定义 obj-c 运行时有多简单?