Objective c 为什么可以';我们不能使用C字符串作为SEL吗?

Objective c 为什么可以';我们不能使用C字符串作为SEL吗?,objective-c,methods,selector,objective-c-runtime,Objective C,Methods,Selector,Objective C Runtime,所以,我又一次搞乱了objc运行时(令人惊讶),我发现了一个有趣的代码块: 据我所知,选择器的内容是相同的,那么为什么第二个选择器会崩溃并显示以下错误消息呢 ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序, 原因:'-[\uu NSArrayM addObject:]:无法识别的选择器已发送到实例 0x101918720'*** 选择器是插入的C字符串,通过地址而不是内容进行比较。字符串内容仅用于与外部字符串表示形式之间的转换。实习是为了提高性能——

所以,我又一次搞乱了objc运行时(令人惊讶),我发现了一个有趣的代码块:

据我所知,选择器的内容是相同的,那么为什么第二个选择器会崩溃并显示以下错误消息呢

***
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序, 原因:'-[\uu NSArrayM addObject:]:无法识别的选择器已发送到实例 0x101918720'
***


选择器是插入的C字符串,通过地址而不是内容进行比较。字符串内容仅用于与外部字符串表示形式之间的转换。实习是为了提高性能——当运行时查找与选择器匹配的方法实现时,它可以直接比较选择器指针,而不是取消引用每个指针并比较字符。

Hmm。。。在查看了
\u sel\u registerName
之后,我相信您是正确的。尽管如此,我还是想知道到底会有多大的性能差异……字符串/选择器API也强烈暗示了这一点;请参阅文档及其与
sel\u registerName()的连接。
。objc\u msgSend目前大约运行8个周期。里面没有足够的空间放一个strcmp()请注意,您可以使用
sel\u registerName()
将C字符串转换为受祝福的sel(它基本上是在幕后对字符串进行唯一化,以保留后续的指针标识)。还请注意,决不能直接依赖SEL作为
char*
。可能永远都是这样,但这并不意味着这个假设是正确的。
const char *sel_getName(SEL sel) {
#if SUPPORT_IGNORED_SELECTOR_CONSTANT
    if ((uintptr_t)sel == kIgnore) return "<ignored selector>";
#endif
    return sel ? (const char *)sel : "<null selector>";
}
SEL normalSEL  = @selector(addObject:);
SEL cStringSEL = (SEL) "addObject:";

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1", @"2", nil];

[arr performSelector:normalSEL withObject:@"3"];
[arr performSelector:cStringSEL withObject:@"4"];

NSLog(@"%@", arr);