1.消息机制

RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。

对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何二义性。OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

[obj makeText];

首先,编译器将代码[obj makeText];转化为objc_msgSend(obj, @selector (makeText));,在objc_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行。

2.消息转发(可以间接实现多重继承)

当向someObject发送某消息,但runtime system在当前类和父类中都找不到对应方法的实现时,runtime system并不会立即报错使程序崩溃,而是依次执行下列步骤:

1.动态方法解析:向当前类发送 resolveInstanceMethod: 信号,检查是否动态向该类添加了方法。(迷茫请搜索:@dynamic)

2.快速消息转发:检查该类是否实现了 forwardingTargetForSelector: 方法,若实现了则调用这个方法。若该方法返回值对象非nil或非self,则向该返回对象重新发送消息。

3.标准消息转发:runtime发送methodSignatureForSelector:消息获取Selector对应的方法签名。返回值非空则通过forwardInvocation:转发消息,返回值为空则向当前对象发送doesNotRecognizeSelector:消息,程序崩溃退出。
这里只对2进行代码演示:意思是说,本类实现不了的方法,可以转发给别的类去实现

- (id)forwardingTargetForSelector:(SEL)aSelector
{class *other = [class new];if ([other forwardingTargetForSelector:aSelector]) {return other;}else{return [super forwardingTargetForSelector:aSelector];}
}

这样如果本类中没有的方法,就会去class中尝试查找,如果有,则返回class对象,让其执行,这样就实现了快速消息转发

转载于:https://www.cnblogs.com/zhaoyunboy/p/objc_msgsend-and-msg-forwarding.html

iOS的消息机制和消息转发相关推荐

  1. mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...

  2. mfc大观之五、六(消息机制和消息运行)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 写过windows程序的朋友都知道,win32主要是利用消息进行界面的编写的.那么在mfc中, ...

  3. linux的消息机制,linux消息机制的过程是什么啊,请赐教

    LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...

  4. c语言linux消息机制,linux消息机制的过程是什么啊,请赐教

    LINUX的安装过程很简单,按照它的提示进行就可以了.重点就是分区那里.通常我们使用双系统,那样我们在LINUX分区的时候不要把WIN分区跟格掉就好,然后要记得分一个SWAP分区,然后根据您的需要进行 ...

  5. Android 消息机制详解(Android P)

    前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...

  6. 【转】编程思想之消息机制

    从一个剧情开始 路遥的<平凡的世界>因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的: 在一个半山腰县立高中的大院坝里,在一个校园内的南墙根下,按班级排起 ...

  7. Android Handler消息机制源码分析

    一,前言 众多周知, Android 只允许在主线程中更新UI,因此主线程也称为UI线程(ActivityThread). 如此设计原因有二: (1) 由于UI操作的方法都不是线程安全的,如果多个线程 ...

  8. android消息机制—Looper

    Looper在android的消息机制充当消息循环的角色,它不停的充MessageQueue中拿出消息,并将消息交给Hanlder处理,下面是他的常用方法解析. 项目源码 Looper的创建 1. a ...

  9. SendMessage和PostMessage及Windows消息机制简介

    SendMessage: The SendMessage function sends the specified message to a window or windows. It calls t ...

最新文章

  1. leetcode 之Single Number(13)
  2. Photoshop图层学习总结
  3. apt-get 更新源推荐
  4. Nginx+Tomcat+Memecached实现session共享配置
  5. mongodb 笔记
  6. 46.Linux/Unix 系统编程手册(下) -- System V 消息队列
  7. 用 keepalived 搭建高可用集群之 IP Failover
  8. 最新个人主页源码最新非泛滥版本
  9. 视频教程-学透JavaScript-JavaScript
  10. HTML 数据可视化模板 echarts实现
  11. ipad怎么阅读html文件,iPad浏览器怎么开阅读模式
  12. POS机交易支付知识点整理
  13. 周杰伦新专辑预售热点传播渠道分析
  14. php 和风天气,为博客添加实时天气功能(和风天气、中国气象、心知天气)
  15. python 用tushare每日获得每天股票数据
  16. 光功率显示c语言程序,c语言程序设计 - 三电实验教学中心.doc
  17. BUGKU misc--细心的大象--writeup
  18. 数字手势识别App--(3)图像识别
  19. 【JAVA】Object类的方法简谈
  20. 特征提取算法--ORB

热门文章

  1. pap认证过程_PPP协议当中LCP协商过程详解和PAP认证原理介绍
  2. heapdump分析工具_.NET Perfview 分析进程性能
  3. pip安装wxpython报错_Ubuntu 上搭建robotframework
  4. ionic获取手机通讯录
  5. uni-app条件编译:#ifdef #ifndef #endif
  6. linux nand 坏块_韦东山-NAND 上面都是坏块怎么办啊? - 百问网嵌入式问答社区
  7. 解决maven项目没有Maven Dependencies
  8. maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
  9. 模型计算机控制器的设计,模型计算机控制器的设计.pdf
  10. tx2 fpga pcie无法读写_Cyclone V SOC(ARM+FPGA)开发文档_之开发流程详解