OC的消息机制简单介绍
在OC的消息机制中主要分为三个阶段,分别为:
1、消息发送阶段:从类以及父类的方法缓存列表和方法列表查找方法。
2、动态解析阶段:在消息发送阶段没有找到方法,则会进入这个阶段,负责动态添加方法实现。
3、如果没有实现动态解析方法,则会进行消息转发阶段,将消息转发给可以处理消息的接受者来处理。
如果以上都没有实现就会报出找不到方法的崩溃。
一、消息转发
首先判断这个对象是不是nil,如果是就相当于直接break,如果有,则会通过对象的isa指针找到这个类,在缓存的方法列表中查找,如果有则执行,没有则去方法列表中查找,如果没有通过superclass找到父类,在父类的缓存方法列表和方法列表中查找。
二、上述没有找到就会进入动态方法解析
根据是对象方法还是类方法会调用不同的方法:
类方法:resolveClassMethod
实例方法:resolveInstanceMethod
在方法中通过class_addMethod,动态添加方法的实现。
三、消息转发
通过签名,runtime生成了一个新的对象NSInvocation,发送给了forwardInvocation方法,在这个方法中让另外一个对象执行最开始的方法。如果forwardingTargetForSelector返回值不为空,就会让这个转发的目标处理消息。如果为nil,则会methodSignatureForSelector返回一个方法签名会调用forwardInvocation方法,根据NSInvocation修改方法的对象(方法的调用者,方法名,以及方法的参数)即可。如果methodSignatureForSelector返回为nil,则会doseNotRecognizeSelector方法内部。
最后都没有实现就会崩溃,因为找不到方法的实现。
OC的消息机制简单介绍的更多相关文章
- Objective-C 利用OC的消息机制,使用Method Swizzling进行方法修改
功能:修改父类不可修改函数方法,函数方法交换 应用场景:假如我们使用的他人提供一个的framework,.m已被打包成二进制.a无法修改源码,只留下.h头文件,那假如代码中某个函数出现了问题可以通过这 ...
- Android的消息机制简单总结
参考文章: http://gityuan.com/2015/12/26/handler-message-framework/#next 参考资料: Android Framework的源码: Mess ...
- Redis Cluster架构和设计机制简单介绍
之前另一篇文章也介绍了 Redis Cluster (link,在文章的后半部分) 今天看到这一篇,简单说一下(http://hot66hot.iteye.com/blog/2050676) 作者的目 ...
- android handler机制简单介绍
我们需要了解4个类: handler:处理者,用于发送和接收信息 massage:消息.里面可以存储消息的许多信息 looper:循环泵,用于循环取出消息队列中的消息 MessageQueue(一般不 ...
- NSNotificationCenter消息机制的介绍
转载自http://www.cnblogs.com/pengyingh/articles/2367374.html NSNotificationCenter的作用是专门提供程序中不同类之间的消息通讯而 ...
- java反射机制简单介绍
1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...
- JavaScript消息机制入门篇
JavaScript这个语言本身就是建立在一种消息机制上的,所以它很容易处理异步回调和各种事件.这个概念与普通的编程语言基础是不同的,所以让很多刚接触JavaScript的人摸不着头脑.JavaScr ...
- 消息中间件-activemq消息机制和持久化介绍(三)
前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...
- 【涂鸦物联网足迹】涂鸦云平台消息服务—顺带Pulsar简单介绍
前序系列文章>>> [涂鸦物联网足迹]涂鸦云平台标准指令集 开放消息平台主要通过 Pulsar 主动推送各种事件数据给外部合作伙伴,以满足合作伙伴对消息实时性和消息持久化的要求. 一 ...
随机推荐
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
- Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性
在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; ...
- java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...
- webpack中引用jquery
1.首先需要添加项目中jquery的依赖 npm install jquery --save-dev 2.参考配置代码: var webpack = require("webpack&quo ...
- java第九天,接口是什么?如何实现接口
接口 很多人纳闷Java为什么会有接口这个知识点呢?其实很大程度上是为了间接实现多继承.但是因为C++的多继承实在是一个难点,Java为了吸取C++的教训,就推出了接口这个概念.接口是一种公共规范标准 ...
- Matlab入门(二)
数据类型 1.整形 有符号 1 字节整数 -27 - 27-1 int8() 有符号 2 字节整数 -215 - 215-1 int16() 有符号 4 字节整数 -231 - 231-1 int32 ...
- HAproxy 基础配置
基础配置详解 HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分 global:全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 ...
- Python语言-selenium webdriver操作记录汇总
1.控制浏览器大小 set_window_size() 设置浏览器大小 该方法有两个参数,第一个参数是宽,第二个是高 maximize_window() 设置浏览器全屏显示,无参数 chrome谷歌浏 ...
- Python 控制流代码混淆简介,加大别人分析你代码逻辑和流程难度
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- 【简单了解系列】从基础的使用来深挖HashMap
HashMap定义 说的专业一点,HashMap是常用的用于存储key-value键值对数据的一个集合,底层是基于对Map的接口实现.每一个键值对又叫Entry,这些Entry分散的存储在一个由数组和 ...