关于@selector()
iOS中的消息会被转化成一个“selector”作为objc_msgSeng的一个参数发送
[object hello]
=>> objc_msgSend(object,@selector(hello))
那么@selecto的生成是否会因为类的不同而生成不同?
定义一个简单的类
@interface TestObject : NSObject
-(void)justTest;
@end
@implementation TestObject
-(void)justTest {
NSLog(@"hello");
}
@end
主函数中打断点实现:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
TestObject* object = [[TestObject alloc] init];
[object justTest];
}
return 0;
}
在[object test]出打断点测试,
第二处po打印的是一个未定义的方法,可以看出地址变化的非常的大。
加入一行代码:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
TestObject* object = [[TestObject alloc] init];
__unused SEL sel = @selector(undefinedMethod);
[object justTest];
}
return 0;
}
这样猜想OC是维护了一个@selector的表;使用@selectorde方式会根据名字查找方法,如果没有该方法则会生成一个SEL加入@selector的表;OC在编译期间会扫描文件,将方法或者是@selector形式的方法加入oc维护的选择子表。