1.什么是SEL类型

  • SEL类型代表着方法的签名,在类对象的方法列表中存储着该签名与方法代码的对应关系

  • 每个类的方法列表都存储在类对象中

  • 每个方法都有一个与之对应的SEL类型的对象
  • 根据一个SEL对象就可以找到方法的地址,进而调用方法
  • SEL类型的定义

    • typedef struct objc_selector *SEL;
  • 首先把test这个方法名包装成sel类型的数据

  • 根据SEL数据到该类的类对象中,去找对应的方法的代码,如果找到了就执行该代码
  • 如果没有找到根据类对象上的父类的类对象指针,去父类的类对象中查找,如果找到了,则执行父类的代码
  • 如果没有找到,一直像上找,直到基类(NSObject)
  • 如果都没有找到就报错。

  • 注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
Dog *dog=[[Dog alloc] init];
[dog eat];

2.SEL使用

  • 定义普通的变量

    • 如:SEL sel = @selector(show);
  • 作为方法实参与NSObject配合使用

  • 检验对象是否实现了某个方法
    • - (BOOL) respondsToSelector: (SEL)selector 判断实例是否实现这样方法
    • + (BOOL)instancesRespondToSelector:(SEL)aSelector;
   BOOL flag;
// [类 respondsToSelector]用于判断是否包含某个类方法
flag = [Person respondsToSelector:@selector(objectFun)]; //NO
flag = [Person respondsToSelector:@selector(classFun)]; //YES Person *obj = [[Person alloc] init]; // [对象 respondsToSelector]用于判断是否包含某个对象方法
flag = [obj respondsToSelector:@selector(objectFun)]; //YES
flag = [obj respondsToSelector:@selector(classFun)]; //NO // [类名 instancesRespondToSelector]用于判断是否包含某个对象方法
// instancesRespondToSelectorr只能写在类名后面, 等价于 [对象 respondsToSelector]
flag = [Person instancesRespondToSelector:@selector(objectFun)]; //YES
flag = [Person instancesRespondToSelector:@selector(classFun)]; //NO
  • 让对象执行某个方法
  1. - (id)performSelector:(SEL)aSelector;
  2. - (id)performSelector:(SEL)aSelector withObject:(id)object;
  3. - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
  Person *p = [Person new];
SEL s1 = @selector(objectFun);
[p performSelector:s1]; SEL s2 = @selector(objectFun:);
[p performSelector:s2 withObject:@"lnj"]; SEL s3 = @selector(objectFun:value2:);
[p performSelector:s3 withObject:@"lnj" withObject:@"lmj"]; SEL s4 = @selector(classFun);
[Person performSelector:s4]; SEL s5 = @selector(classFun:);
[Person performSelector:s5 withObject:@"lnj"]; SEL s6 = @selector(classFun:value2:);
[Person performSelector:s6 withObject:@"lnj" withObject:@"lmj"];
  • 作为方法形参
@implementation Person

- (void)makeObject:(id) obj performSelector:(SEL) selector
{
[obj performSelector:selector];
}
@end int main(int argc, const char * argv[]) { Person *p = [Person new];
SEL s1 = @selector(eat);
Dog *d = [Dog new];
[p makeObject:d performSelector:s1]; return 0;
}

3.OC方法查找顺序

  • 1.给实例对象发送消息的过程(调用对象方法)

    • 根据对象的isA指针去该对象的类方法中查找,如果找到了就执行
    • 如果没有找到,就去该类的父类类对象中查找
    • 如果没有找到就一直往上找,直到跟类(NSObject)
    • 如果都没有找到就报错
  • 2.给类对象发送消息(调用类方法)

    • 根据类对象的isA指针去元对象中查找,如果找到了就执行
    • 如果没有找到就去父元对象中查找
    • 如果如果没有找到就一直往上查找,直到根类(NSOject)
    • 如果都没有找到就报错

SEL类型的更多相关文章

  1. iOS SEL类型和创建

    SEL selAction =NSSelectorFromString([actionArrayobjectAtIndex:indexArray]); [item addTarget:self act ...

  2. SEL 类型

    1.SEL类型的第一个作用, 配合对象/类来检查对象/类中有没有实现某一个方法 SEL sel = @selector(setAge:); Person *p = [Person new]; // 判 ...

  3. Objective-C description方法 SEL类型

    description方法 #import "Person.h" @implementation Person - (void) setAge : (int) age { _age ...

  4. Objective-C 布尔类型 和 class、SEL类型

    发现非常多刚開始学习的人无法区分bool和BOOL及class类型,今天闲来无事.写个博文做个区分 1. bool是C语言的布尔类型.有true和false,BOOL是Objective C 语言的布 ...

  5. Objective-C中的SEL、IMP和Class类型

    1.SEL类型 例子: SEL say;        SEL skin; Objective-C 在编译的时候, 会根据方法的名字(包括参数序列),生成一个用 来区分这个方法的唯一的一个 ID,这个 ...

  6. Objective-C数据类型之id,SEL,BOOL,nil,NULL和NSNull

     id id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象.常见的id类型就是类的delegate属性. SEL SEL类型是 ...

  7. Object-C中动态类型对象相关操作汇总

    Object-C(以后简称OC)中有id类型,相对于明确定义类型的静态类型,称为动态类型. 使用动态类型,配合多态(不同类型拥有同名方法),动态绑定(运行时决定实际调用的方法)可以将很多判断延迟到运行 ...

  8. objective-c系列-动态类型和动态绑定

    /* 静态类型: 变量的类型在编译之时就被确定下来. 动态类型: 对象的类型由对象的内存里的某个结构数据来决定它是什么类型, 而不是在编译之时就被确定下来的数据类型. 对象的类型只有在运行时才知道. ...

  9. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

随机推荐

  1. UTF-8,GBK,ANSI之间的关系和区别

    GBK应该是属于ANSI之中的,在ANSI的国际通用集,GBK是专门来解决中文编码的,是双字节的,不论中英文都是双字节,而UTF-8是才用的另外的一种编码方式,对英文是用8位,对中文使用24位,是和A ...

  2. 图像数据到网格数据-1——Marching Cubes算法的一种实现

    概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...

  3. 了解C#的协变和逆变

    前言 在引用类型系统时,协变.逆变和不变性具有如下定义. 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类. Covariance 使你能够使用比原始指定的类型派生程度更大的类 ...

  4. Flutter 让你的Dialog脱胎换骨吧!(Attach,Dialog,Loading,Toast)

    前言 Q:你一生中闻过最臭的东西,是什么? A:我那早已腐烂的梦. 兄弟萌!!!我又来了! 这次,我能自信的对大家说:我终于给大家带了一个,能真正帮助大家解决诸多坑比场景的pub包! 将之前的flut ...

  5. django 使用createView创建视图是form_valid()没有通过?

    django 使用createView创建视图是form_valid()没有通过的原因: fields中定义的字段要与from表单中的字段相对应 修改后 接着又报错: 查看没有取到id,最后通过req ...

  6. quasar框架在store中使用router跳转页面报错

    网上一通百度,终于在这篇博客中找到原因.  https://www.cnblogs.com/remly/p/12995936.html 原因是: 在router中导出了一个工厂函数, 既然是一个函数, ...

  7. etcd的raft选取机制

    etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠, ...

  8. spring boot 中使用swagger

    一.pom.xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...

  9. 鲜为人知的一些meta标签作用

    来自UC Scrat-team http://scrat-team.github.io/ <meta name="viewport" content="width= ...

  10. ELF文件格式学习总结

    ELF文件格式学习总结 ELF文件格式学习总结1. 概述2. 目标文件结构3. ELF文件头3.1 魔数3.2 文件类型3.3 机器类型4. ELF文件内容4.1段表4.2字符串表(.**strtab ...