oc-22-sel

/**
 sel:
 1.作用:包装方法
 2.格式:typedef struct objc_selector *SEL;
 3.用法:
  SEL 名称 = @selector(方法);
  调用形式:
  [对象 performSelector:SEL类型的数据];
 // 判断某个类有没有某个方法
 + (BOOL)instancesRespondToSelector:(SEL)aSelector;
 */
#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
         // 1.包装方法,将方法包装成sel格式
        SEL c = @selector(study);
        // 2.创建对象
        Student *s = [Student new];
        // 3.调用包装好的方法
        [s performSelector:c];
        // 4.判断某个类是否有某个方法
        BOOL res = [Student instancesRespondToSelector:c];
        NSLog(@"%d",res);
    }
    return 0;
}
注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用 方法。
  • 类中方法存储的原理:

  • 1)类里面的方法都是被转换成SEL变量进行存储的。
  • 2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

  • [d run]; ------->SEL 

    • 寻找方法的过程:

    • (1)首先把test这个方法名包装成sel类型的数据;
    • (2)根据SEL数据找到对应的方法地址;
    • (3)根据方法地址调用相应的方法。
    • (4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

原文地址:https://www.cnblogs.com/yaowen/p/5310821.html