SEL 全称叫 selector 选择器, 是一个数据类型(其实是一个类), 所以要在内存中申请空间存储数据
3.1 类是以Class对象的形式存储在代码段之中.
类名:存储的这个类的类名. NSString
3.2 还要将方法存储在类对象之中.如何将方法存储在类对象之中.
1). 先创建1个SEL对象.
2). 将方法的信息存储在这个SEL对象之中.
3). 再将这个SEL对象作为类对象的属性.
3.3 拿到存储方法的SEL对象.
1. 因为SEL是1个typedef类型的 在自定义的时候已经加*了.所以 我们在声明SEL指针的时候 不需要加*
2. 取到存储方法的SEL对象,
SEL s1 = @selector(方法名);
3.4 调用方法的本质.
内部的原理: 如: [p1 say];
1. 先拿到存储say方法的SEL对象,也就是拿到存储say方法的SEL数据. SEL消息.
2. 将这个SEL消息发送给p1对象.
3. 这个时候,p1对象接收到这个SEL消息以后 就知道要调用方法
4. 根据对象的isa指针找到存储类的类对象.
5. 找到这个类对象以后 在这个类对象中去搜寻是否有和传入的SEL数据相匹配的.
如果有 就执行 如果没有再找父类 直到NSObject
3.5 OC最重要的1个机制:消息机制.
调用方法的本质其实就是为对象发送SEL消息.
[p1 say]; 为p1对象发送1条say消息.
3.6 重点掌握:
1) 方法是以SEL对象的形式存储起来.
2) 如何拿到存储方法的SEL对象.
3.7 手动的为对象发送SEL消息.
1) 先得到方法的SEL数据. 将这个SEL消息发送给p1对象.
2) 调用对象的方法 将SEL数据发送给对象. - (id)performSelector:(SEL)aSelector;
如:两种调用1个对象
Person *p1 = [Person new];
[p1 say]
SEL s1 = @selector(say);
[p1 performSelector:s1] == [p1 say]效果是完全一样的.
3) 调用1个对象的方法有两种.
第一种:[对象名 方法名]
第二种:手动的为对象发送SEL消息.
3.8 注意:
1). 如果方法有参数 那么方法名是带了冒号的.
2). 如果方法有参数,如何传递参数.
那么就调用另外1个方法.一般小于2个参数
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
3.9 如果有多个参数(大于3个):封装为一个对象就可以了
3.10 关于SEL 只要知道:
1) 类是以Class对象的形式存储在代码段.
2) 如何取到存储类的类对象.
3) 如何使用类对象调用类的类方法
4) 方法是以SEL数据的形式存储的.
5) 调用方法的两种方式.