相关疑难解决方法(0)

为什么我们不能将C字符串用作SEL?

所以,我一直在讨论objc-runtime(惊喜),我在这里找到了一个有趣的代码块:

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>";
}
Run Code Online (Sandbox Code Playgroud)

所以,这告诉我的是SEL,在每种习惯中,a 都等同于C弦.执行包含SEL的前16个字节的十六进制转储,@selector(addObject:)提供以下内容:

61 64 64 4F 62 6A 65 63 74 3A 00 00 00 00 00 00

这等于C字符串addObject:.

话虽如此,当我使用C字符串作为选择器时,为什么这段代码会崩溃?

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);
Run Code Online (Sandbox Code Playgroud)

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

*** …

methods objective-c objective-c-runtime selector

13
推荐指数
1
解决办法
503
查看次数