SEL全程selector选择器,SEL为系统经过typdef定义,声明时不用加*,SEL是一个类,OC的方法都属于这个类型,方法代码存放在内存中的代码段中。
OC方法存储在代码的方式:
1.先创建一个SEL对象。
2.把方法信息存储给SEL这个对象。
3.把这个生成的SEL对象作为类对象属性,存储在类对象所在的代码段中。
4.多个SEL方法的对象,以类似数组的方式存放在类对象代码段中。
OC方法调用的原理:
1.获取该方法的SEL对象,SEL *slelector = @selector(方法名);
2.将SEL发送消息给即将调用的对象。
3.对象根据isa指针去代码段寻找SEL。
4.如果isa指针未找到该SEL,怎会根据代码段的父类isa指针去寻找父类的方法,依次寻找,直到NSObject类。
5.如果有找到,执行该方法,如果未找到会报错。
注意:编译器只根据指针类型去做以上判断,运行时会检查对象本身是否有这个方法,如果指针类型和对象类型不一致且对象缺失该方法,则无法执行该方法代码指令。
手动实现调用方法:
第一步:获取SEL对象:SEL fun = @selector(方法名:);
第二步:[对象 performSelector:方法名];
避免发生对象误调用缺失的方法:
BOOL isFun = [对象名称 respondsToSelector:fun];
返回YES则说明该对象有这个方法,返回NO说明没有这个方法。