黑马程序员-OC语言-SEL类型(听课笔记)

来源:互联网 发布:李晶团扇 淘宝店 编辑:程序博客网 时间:2024/05/21 22:26

------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------

1 、SEL类型

SEL:全称selector 一种用来表示方法名类型的数据类型(方法名)。
SEL类型作用:
1)可以定义变量
2)可以用来作为方法的形参
3)可以用来作为方法的实参


类中方法存储的原理:

1)类里面的方法都是被转换成SEL变量进行存储的。
2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

[d run]; ------->SEL


Person *p=[[Person alloc] init];
[p test];


寻找方法的过程:
(1)首先把test这个方法名包装成sel类型的数据;
(2)根据SEL数据找到对应的方法地址;
(3)根据方法地址调用相应的方法。
(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。


关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。


注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。


3)我们可以自己手动把方法转换成SEL,然后用这个SEL去查找方法。



Objetive-C中的Method结构

struct objc_method{
SEL method_name;//方法名
char *method_types; //方法地址
IMP method_imp; //方法地址(IMP)
};
typedef  objc_method Method


什么是IMP
– IMP是”implementation”的缩写,它是objetive-C 方法 (method)实现代码块的地址,类似函数指针,通过它可以 直接访问任意一个方法。免去发送消息的代价。


获取方法的IMP
– -(IMP)methodForSelector:(SEL)aSelector;
SEL print_sel =NSSelectorFromString(@“print:”);//获得SEL

IMP imp=[person methodForSelector:print_sel];//得到IMP
imp(person,print_sel,@“*********”);//通过IMP直接调用方法
等效调用:[person print_sel:@“*********”];


– imp的第一参数是对象自己(self),第二参数是方法标示, 第三个是方法的参数

0 0
原创粉丝点击