我不太了解 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/