SEL


  1. SEL全称叫做 selector选择器。SEL是一个数据类型,所以要在内存中申请空间存储数据,SEL其实是一个类,SEL对象是用来存储一个方法的。
  2. 如何将方法存储在类对象之中
  • 先创建1个SEL对象
  • 将方法的信息存储在这个SEL对象之中
  • 再将这个SEL对象作为类对象的属性。
  1. 拿到存储方法的SEL对象
  • 因为SEL是一个typedef类型的,在自定义的时候已经加了,所以我们在声明SEL指针的时候,不需要加
  • 取到存储方法的SEL对象
SEL s1 =@selector(方法名)
  1. 调用方法的本质
  • 先拿到存储sayHi方法的SEL对象,也就是拿到存储sayHi方法的SEL数据,SEL消息。
  • 将这个SEL消息发送给p1对象
  • 这个时候,p1对象接收到这个SEL消息以后,就知道要调用方法
  • 根据对象的isa指针找到存储类的类对象
  • 找到这个类的对象以后,在这个类对象中去搜寻是否有和传入的SEL数据相匹配的。如果有就执行,如果没有再找父类,直到NSOBject。 OC最重要的一个机制:消息机制;
  • 调用方法的本质其实就是为对象发送SEL消息。 [p1 sayHi]为p1对象发送一条sayHi消息
  1. 手动的为对象发送SEL消息
  • 先得到方法的SEL数据
  • 将这个SEL消息发送给p1对象,调用对象的方法,将SEL数据发送给对象。
Person *p1 = [person new];
SEL s1 = @selector(sayHi);
[p1 performSelector:s1];//与[p1 sayHi]相同
  1. 注意事项
  • 如果方法有参数,那么方法名是带了冒号的
  • 如果有参数,则调用如下方法
SEL s1 = @selector(eatWithFood:);
[p1 performSelector:s1 withObject:@"红烧肉" withObject:(id)]
  • 如果有多个参数,则将数据封装成对象再传递
[p1 performSelector:s1 withObject:对象名]
  1. 需掌握
  • 类是以Class对象的形式存储在代码段。
  • 如何取到存储类的类对象
  • 如何使用类对象调用类的类方法
  • 方法是以SEL数据的形式存储的
  • 调用方法的两种方式
学习