Method,SEL,IMP
来源:互联网 发布:.net b2b商城源码 编辑:程序博客网 时间:2024/06/10 09:51
这三个概念,虽然在平时的时候总是在用,但是最近写runtime
的时候,又感觉有点糊涂,今天就把他们的关系搞清楚。
Method
先看下定义
runtime.h/// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型typedef struct objc_method *Method;struct objc_method { SEL method_name OBJC2_UNAVAILABLE; char *method_types OBJC2_UNAVAILABLE; IMP method_imp OBJC2_UNAVAILABLE;}
Method和我们平时理解的函数是一致的,就是表示能够独立完成一个功能的一段代码,比如:
- (void)logName{ NSLog(@"name");}
这段代码,就是一个函数。
我们来看下objc_method
这个结构体的内容:
- SEL method_name 方法名
- char *method_types 方法类型
- IMP method_imp 方法实现
在这个结构体重,我们已经看到了SEL
和IMP
,说明SEL
和IMP
其实都是Method
的属性。
我们接着来看SEL
。
SEL
还是先看定义
Objc.h/// An opaque type that represents a method selector.代表一个方法的不透明类型typedef struct objc_selector *SEL;
这里要先说明下selector
和SEL
的关系,我在写本文的时候,其实搜索的是selector
,直到我看到了selector
的定义,才发现我理解一直不对。
@property SEL selector;
在文档中,selector
的定义都是这样声明,也就是说:selector
是SEL
的一个实例,只是在iOS中,selector
的使用是如此的频繁,我们才会把他当成一个概念。
selector
怎么理解呢?我们可以想想股票,比如市场上有如此多公司在纳斯达克上市,而且他们的名字又非常的长,或者有些公司的名称也是相似的,都是**有限公司。那当市场去指定一个股票的时候,效率会非常低,当你着急想买股票的时候,你会跟你的经纪人说:“hi,peter,给我买一百股Tuniu limited liability company的股票吗?”,也许等你说完,经纪人输入完,市场就变化了,所以纳斯达克通常用代码,比如“TOUR”.这里的selector
有类似的作用,就是让我们能够快速找到对应的函数。
文档中是这样讲的:
A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime. Selectors generated by the compiler are automatically mapped by the runtime when the class is loaded.
在iOS中,runtime
会在运行的时候,通过load
函数,将所有的method
hash然后map到set
中。这样在运行的时候,寻找selector
的速度就会非常快,不会因为runtime
特性牺牲太多的性能。
selector
既然是一个string,我觉得应该是类似className+method
的组合,命名规则有两条:
- 同一个类,selector不能重复
- 不同的类,selector可以重复
这也带来了一个弊端,我们在写C代码的时候,经常会用到函数重载,就是函数名相同,参数不同,但是这在Objective-C
中是行不通的,因为selector
只记了method
的name,没有参数,所以没法区分不同的method。
比如:
- (void)caculate(NSInteger)num;- (void)caculate(CGFloat)num;
是会报错的。
我们只能通过命名来区别:
- (void)caculateWithInt(NSInteger)num;- (void)caculateWithFloat(CGFloat)num;
IMP
看下IMP
的定义
/// A pointer to the function of a method implementation. 指向一个方法实现的指针typedef id (*IMP)(id, SEL, ...); #endif
这个就比较好理解了,就是指向最终实现程序的内存地址的指针。
综上,在iOS的runtime
中,Method
通过selector
和IMP
两个属性,实现了快速查询方法及实现,相对提高了性能,又保持了灵活性。
- Method,SEL,IMP
- Objective-c中的SEL、Method、IMP
- id,SEL,Nil,nil,IMP,Method,Class类型
- Objective-C-- id、nil、Nil、SEL、IMP、Method、Class
- objc/runtime中SEL、IMP和method动态定义
- objc/runtime中SEL、IMP和method动态定义
- SEL和IMP
- @class SEL IMP
- SEL和IMP
- SEL和IMP
- SEL、IMP和Class
- IMP 和 SEL 区别
- SEL和IMP
- iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Ivar
- iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Ivar
- Objective-c SEL & Class IMP
- class,sel and IMP说明
- iOS中SEL和IMP
- ElasticSearch--停用词的使用
- linux,对根目录进行扩充(lvm)
- react-native tab标签
- 皇后问题 搜索
- ubuntu下查看特定程序所占用的网络端口号
- Method,SEL,IMP
- 03、ES6 字符串扩展
- C++作业5
- 数据结构之单链表的冒泡排序
- Ubuntu 16.04下Apache2+php7以及Nginx+php7迷醉记录
- jQuery对象转成DOM对象
- 爬取广州天气数据和数据可视化
- C++作业5
- xListView的简单使用