Objective-C消息机制
来源:互联网 发布:sql server2012教程 编辑:程序博客网 时间:2024/05/17 22:01
在oc中方法和方法时实现是在执行阶段绑定的,而不是编译阶段,编译器会将消息发送转换成对objc_msgSend方法的调用。
[receiver message]; 将被转换为:objc_msgSend(receiver, selector);
消息发送时同样可以添加多个参数
objc_msgSend(receiver, selector, arg1, arg2, …);
消息发送机制动态绑定的过程
- 查找selector所指代的程序(方法的真正实现)。因为不同类对同一方法有不同的实现,所以对方法的真正实现的查找依赖于receiver的类
- 调用该实现,并将一系列参数传递过去
- 将该实现的返回值作为自己的返回值,返回之
消息传递的关键是,编译器构建每个类和对象时所采用的数据结构。每个类都包含以下两个必要元素:
- 一个指向父类的指针
- 一个调度列表(dispatch table)。 该调度表将类的selector与方法的实际内存地址关联起来、
每个对象都有一个指向所属类的指针isa。通过该指针,对象可以找到它所属的类,也就找到了其全部父类,如下图所示:
过程描述:当向一个对象发送消息,objc_msgSend方法会通过该对象的isa指针找到所属类,然后在类的调度表中查找selector,如果无法找到,objc_msgSend就会通过类中指向父类的指针找到父类,在父类中查找selector,以此类推一直找到NSObject类。一旦找到了selector, objc_msgSend方法根据调度表的内存地址调用该实现。 通过这种方式,message与方法的真正实现在执行阶段才绑定。为了消息发送和执行的效率,系统将全部selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的selector以及继承父类的selector。在查找调度表之前,消息发送系统会优先检查receive对象的缓存。 缓存命中的情况下,消息发送(messaging)比直接调用方法(function call)只慢一点点点点。注: selector就是一个字符串,用来表示一个方法
0 0
- Objective-C消息机制
- Objective-C的消息机制
- Objective-C语言:消息机制
- Objective-C之消息机制
- Objective C 中的消息机制
- objective-c消息转发机制
- [转载] objective-c 消息机制
- Objective-c 消息转发机制
- Objective-C Runtime 消息机制
- Objective-C 消息转发机制
- Objective-C的消息(message)工作机制
- Objective-C的消息传递机制
- Objective-C的消息(message)工作机制
- Objective-C函数消息机制的理解
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C消息机制的原理
- Objective-C的消息传递机制
- HDU 3277 Marriage Match III (最大流+拆点+并查集)
- 编译器和解释器的区别与联系
- 自定义对话框
- HashMap的实现原理
- LoadRunner中如何验证下载的文件大小、统计下载时间、度量下载速度?
- Objective-C消息机制
- Android 手机震动功能实现
- BI Publisher论坛
- 常规表达式转换为后缀表达式
- Android Studio 快捷键 for Mac OS X
- volatile的作用
- 安装最新版cordova遇到的问题
- org.apache.catalina.tribes.ChannelException: java.net.SocketException
- 中文版iTween帮助文档、参数解析