Effective Objective-C 2.0 第11条:理解objc_msgSend的作用
来源:互联网 发布:免费直播软件 编辑:程序博客网 时间:2024/05/22 01:56
动态绑定
Objective-C是C的超集,C语言使用“静态绑定”,也就是说在编译期间就能决定运行时所应调用的函数。
#import <stdio.h>void printHello() {}void printGoodbye() {}void doTheThing(int age) { if (type == 0) pirntHello(); else printGoodbye(); return;}
如果不考虑“内联”,那么编译器在编译代码的时候就已经知道程序中有printHello与printGoodbye这两个函数了,函数地址实际是硬编码在指令之中的。
若doTheThing写成下列方式
void doTheThing(int type) { void (*fnc) (); if (type == 0) fnc = printHello(); else fnc = printGoodbye(); fnc(); return;}
这时就是使用“动态绑定”了,因为所有调用的函数直到运行期才能确定。
OC动态性
在OC中,如果对某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。在底层,所有方法都是普通的C语言函数,然而对象收到消息以后,究竟该调用哪个方法则完全于运行期决定,给对象发送消息可以这么写:
id returnValue = [someOjbect messageName:parameter];[接受者(receiver) 选择子(selector):参数];
编译器收到此消息后,转换成为一条标准的C语言函数调用,所调用的函数乃是消息传递机制中的核心函数,叫做objc_msgSend,其原型如下:
void objc_msgSend(id self, SEL cmd, ……)【参数可变】
第一个参数代表接受者,第二个参数代表选择子(SEL是选择子类型),后续参数就是消息中的那些参数。编译器会把刚才的消息转换成:
id returnValue = objc_msgSend(someObject, @selector(messageName:), parameter);
先检查接收者的“方法列表”,如果能找到与选择子名称相符的方法,就跳至其实现代码,若是找不到就沿着其集成体系继续向上查找,等找到合适的方法之后跳转,如果最终还是找不到合适的方法,那就执行“消息转发”。
objc_msgSend会将匹配结果缓存在“快速隐射表”里面,每个类都有这么一块缓存,若是稍后稍后还向该类发送与选择子相同的消息,那么执行就快起来了。
objc_msgSend等函数一旦找到应该调用的方法实现之后,就会“跳转过去”,之所以这么做,是因为OC对象的每个方法都可以视为简单的C函数,原型如下:
<return_type> Class_selector(id self, SEL _cmd, ……)
真正的类名和函数名和上面可能不太一样,用“类”(Class)和“选择子”(selector)来命名是解释工作原理,每个类都有一个表格,其中的指针都会指向这种函数,而选择子的名称是查表时所使用的“键”。objc_msgSend正是通过这张表格来寻找应该执行的方法并跳转至其实现的,这里利用“尾调用优化”技术,令“跳转方法实现”这一操作变得简单。
如果一个函数的最后一项操作室调用另外一个函数,那么就可以运用“尾调用优化”技术。编译器会生成跳转至另一个函数所需的指令码,而且不会向调用堆栈中推入新的“栈帧”。只有当函数最后一个操作仅仅是调用其他函数而不会将其返回值另作他用时,才能执行“尾调用优化”技术。
- Effective Objective-C 2.0 第11条:理解objc_msgSend的作用
- 读effective objective-c 2.0 整理文章 - 11条 理解objc_msgSend的作用
- 第11条:理解objc_msgSend的作用
- Effective Objective-C 2.0 第6条:理解“属性”
- Effective Objective-C(第11-14条)动态绑定、objc_msgSend、消息转发机制
- Effective Objective-C(第11-14条)动态绑定、objc_msgSend、消息转发机制
- Effective Objective-C 2.0 第13条:理解“类对象”的用意
- Effective Objective-C 2.0 编写高质量iOS与OS X代码 objc_msgSend 的作用
- Effective Objective-C 2.0 第8条:理解“对象等同性”概念
- Effective Objective-C 2.0 第12条:理解消息转发机制
- Effective Objective-C 2.0 第1条:了解Objective-C语言的起源
- 理解objc_msgSend的作用
- 理解objc_msgSend的作用
- Effective Objective-C 2.0 第3条:多用字面量语法,少用与之等价的方法
- Effective Objective-C(第1-5条)熟悉Objective-C
- Effective Objective-C 2.0 第4条:多用类型常量,少用#define预处理指令
- Effective Objective-C 2.0 第5条:用枚举表示状态、选项、状态码
- Effective Objective-C 2.0 第7条:在对象内部尽量访问实例变量
- 解决MAC ssh本地断开后启动的服务会停止的问题
- switch跳转表分析
- 通知——Notification
- 10003---使用jQuery实现Ajax
- LeetCode:Rotate Array
- Effective Objective-C 2.0 第11条:理解objc_msgSend的作用
- 文件加密程序
- Hql使用总结
- geohash实现(c语言)
- 图片降噪
- C 判断socket 是否已经断开
- 深入理解Java参数传递
- Android LruCache类分析
- HDU - 4763 Theme Section(拓展kmp)