selector到底是什么?
看objc的源码[1], 知道真相的我眼泪掉下来:
static SEL sel_alloc(const char *name, bool copy)
{
selLock.assertWriting();
return (SEL)(copy ? strdup(name) : name);
}
const char *sel_getName(SEL sel)
{
if (!sel) return "<null selector>";
return (const char *)(const void*)sel;
}
从sel_alloc
中可以看出, SEL就是直接用当前的字符串, 或者把当前的字符串拷贝一份, 然后char*强转SEL
从sel_getName
中可以看出, SEL类型可以强转char *
那么SEL就是字符串
那么@selector(xxx) 就是字符串 "xxx"
然后从class里面取方法就是拿这个字符串跟class的methodlist里面取method的name(也就是SEL)做对比, 相等就取到了