SEL类型
1. 【理解】什么是SEL类型
2. 【掌握】SEL使用
3. 【理解】OC方法查找顺序
1.什么是SEL类型
- SEL类型代表着方法的签名,在类对象的方法列表中存储着该签名与方法代码的对应关系
- 每个类的方法列表都存储在类对象中
- 每个方法都有一个与之对应的SEL类型的对象
- 根据一个SEL对象就可以找到方法的地址,进而调用方法
- SEL类型的定义
+ typedef struct objc_selector *SEL;
- 首先把test这个方法名包装成sel类型的数据
- 根据SEL数据到该类的类对象中,去找对应的方法的代码,如果找到了就执行该代码
- 如果没有找到根据类对象上的父类的类对象指针,去父类的类对象中查找,如果找到了,则执行父类的代码
- 如果没有找到,一直像上找,直到基类(NSObject)
- 如果都没有找到就报错。
- >注意:
>+ 在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
Dog *dog=[[Dog alloc] init];
[dog eat];
2. SEL使用
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Animal.h"
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc]init];
//SEl型类第一个作用:配合类/对象检查是否实现了类/对象的方法
SEL sel = @selector(eat);
BOOL sign = [p respondsToSelector:sel];
NSLog(@"sel:%i",sign);
[p speak];
SEL sel2 = @selector(speak);
BOOL sign2 = [p respondsToSelector:sel2];
NSLog(@"sel2:%i",sign2);
//SEL类型第二个作用:配合类/对象调用某一个SEL方法
[p performSelector:sel2];
// withObject: 需要传递的参数
// 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型,
// 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象
SEL sel3 = @selector(signalWithNumber:);
[p performSelector:sel3 withObject:@"1008611"];
SEL sel4 = @selector(sentMessageWithNumber:andCotent:);
[p performSelector:sel4 withObject:@"1008611" withObject:@"CXGPRS"];
//SEL类型第三个作用:作为方法的形参
Animal *a = [[Animal alloc]init];
Class c = [Animal class];
SEL sel5 = @selector(run);
SEL sel6 = @selector(eat);
[p makeObject:a andSel:sel5];
[p makeObject:c andSel:sel6];
// 注意:performSelector最多只能传递2个参数
return 0;
}
3.OC方法查找顺序