【问题标题】:What is the objc_selector implementation? [duplicate]什么是 objc_selector 实现? [复制]
【发布时间】:2015-02-18 10:37:53
【问题描述】:

我发现SEL 类型有下一个定义:

typedef struct objc_selector *SEL;

但我找不到objc_selector 是如何实现的。

好的,如果我们有下一个代码

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  SEL mySelector = NSSelectorFromString(@"mySelector");
  return 0;
}

,那么mySelector 只是一个指针。在它包含的地址之后,我们看到了 C 字符串,可以表示如下:

const char* mySelector = "mySelector";

objc_selector 不是 C 字符串,它是结构,它可以包含其他内容。所以想知道objc_selector结构是怎么实现的。

【问题讨论】:

  • 这是一个更详细的答案...stackoverflow.com/a/19322677/1016102
  • @DanielBocksteger 哇,非常感谢你!我不知道为什么我以前没有找到这个答案。请发布此链接以回答,我想选择您的答案为正确的。它真的节省了我的时间!
  • SEL 是封闭结构。它的内容不应该打扰你。
  • 这是 Alexander 搜索的答案 stackoverflow.com/a/19322677/1016102...但 dehlens 也是正确且好的 :-)
  • objc_selector 没有实现,导致 c/c++ 编译器允许未定义的结构,请参考https://gist.github.com/Jichao/f663400a0a56011171291bbac9aa372b

标签: ios objective-c macos selector objective-c-runtime


【解决方案1】:

这可能对你有帮助:

现在这个很有趣。 SEL 是 "selector" 的类型,它标识方法的名称(而不是实现)。因此,例如-[Foo count]-[Bar count] 方法都共享一个选择器,即选择器"count"。 SEL 是指向结构objc_selector 的指针,但objc_selector 到底是什么?嗯,它的定义不同,具体取决于您使用的是 GNU Objective-C 运行时,还是 NeXT Objective-C 运行时(如 Mac OS X)。好吧,最终 Mac OS X 将 SEL 映射到简单的C strings。例如,如果我们用- (int)blah method 定义一个Foo 类,代码NSLog(@"SEL = %s", @selector(blah)); 将输出SEL = blah.

取自:here

【讨论】:

  • 另外你不应该假设实现保持不变。仅仅因为它现在是一个 C 字符串并不意味着它是一个未来。
  • 您不应该假设在 32 位和 64 位 MacOS X、不同版本的 MacOS X 以及 32 位和 64 位 iOS(包括不同版本的 iOS)上的实现是相同的。仅仅因为它现在是 Objective-C 的几种实现之一中的 C 字符串并不意味着它完全一样。
  • 不幸的是,博客链接现已失效,“抱歉,unixjunkie.blogspot.com 上的博客已被删除。此地址不可用于新博客。”
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2020-02-07
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多