iOS @selector

关于@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]出打断点测试,


iOS @selector_第1张图片
image.png

第二处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;
}
iOS @selector_第2张图片
image.png

这样猜想OC是维护了一个@selector的表;使用@selectorde方式会根据名字查找方法,如果没有该方法则会生成一个SEL加入@selector的表;OC在编译期间会扫描文件,将方法或者是@selector形式的方法加入oc维护的选择子表。

你可能感兴趣的:(iOS @selector)