iOS Sharing #02 | 2019-03-30
目录
1、类方法去哪里找?
2、isa指针有几种类型么?
3、分类的方法具体是在什么时候添加到类的方法列表中?
4、class_addMethod()都需要什么参数?
5、iOS消息转发流程
1、类方法去哪里找?
答: 见上一期《iOS Sharing #01 | 2019-03-23》第5问
5、实例方法去哪里找?
2、isa指针有几种类型么?
答: isa指针分,指针类型和非指针类型,32位只做地址保存,非嵌入式64位架构下,包含除类地址外的其他信息。
3、分类的方法具体是在什么时候添加到类的方法列表中?
答: 类在编译后会以 class_ro_t 的结构把类的信息存储在 bits 里,运行时的 realizeClass 之后,会把 ro 中的所有信息拷贝到 bits 的 data 内,即以 class_rw_t 的形式存在,分类里的方法即在这个时候添加到类的方法表里,并在方法表数组的最前面
4、class_addMethod()都需要什么参数?
答:
/**
* Adds a new method to a class with a given name and implementation.
*
* @param cls The class to which to add a method.
* @param name A selector that specifies the name of the method being added.
* @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd.
* @param types An array of characters that describe the types of the arguments to the method.
*
* @return YES if the method was added successfully, otherwise NO
* (for example, the class already contains a method implementation with that name).
*
* @note class_addMethod will add an override of a superclass's implementation,
* but will not replace an existing implementation in this class.
* To change an existing implementation, use method_setImplementation.
*/
OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp,
const char *types)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);复制代码
- 给类添加一个新的方法和该方法的具体实现
- BOOL: 返回值,YES -------方法添加成功 NO --------方法添加失败
- Class cls: 将要给添加方法的类,传的类型 [类名 class]
- SEL name: 将要添加的方法名,传的类型 @selector(方法名)
- IMP imp:实现这个方法的函数 ,传的类型
- 1、C语言写法:(IMP)方法名
- 2、OC的写法:class_getMethodImplementation(self,@selector(方法名:))
- const char *types:表示我们要添加的方法的返回值和参数
- "v@:@":
- 'v'是添加方法无返回值
- '@'表示是id(也就是要添加的类)
- ':'表示添加的方法类型
- '@'表示参数类型
const char *types含义表:
Code | Meaning |
---|---|
c | A char |
i | An int |
s | A short |
l | A long l is treated as a 32-bit quantity on 64-bit programs. |
q | A long long |
C | An unsigned char |
I | An unsigned int |
S | An unsigned short |
L | An unsigned long |
Q | An unsigned long long |
f | A float |
d | A double |
B | A C++ bool or a C99 _Bool |
v | A void |
* | A character string (char *) |
@ | An object (whether statically typed or typed id) |
# | A class object (Class) |
: | A method selector (SEL) |
[array type] | An array |
{name=type...} | A structure |
(name=type...) | A union |
bnum | A bit field of num bits |
^type | A pointer to type |
? | An unknown type (among other things, this code is used for function pointers) |
注意:
用这个方法添加的方法是无法直接调用的,必须用performSelector:调用。 因为performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。 添加方法是在运行时添加的,你在编译的时候还没有这个本类方法,所以当然不行。
5、iOS消息转发流程
答:
消息转发机制基本分为三个步骤:
- 1、动态方法解析
- 2、备用接受者
- 3、完整转发
代码
类方法:
实例方法:
详细流程:
感谢大佬提供的图片。
仓库
本篇相关代码
联系方式
邮箱: adrenine@163.com
- 掘金 - Adrenine
- 简书 - Adrenine
- Blog - Adrenine
- Github - Adrenine
邮箱: holaux@gmail.com
- 掘金 - oneofai
- Blog - oneofai
- Github - oneofai
邮箱: ledahapple@icloud.com
- Github - ledah217
- Notion - 217
iOS Sharing #02 | 2019-03-30相关推荐
- 2019.03.30【NOIP提高组】模拟 B 组 排序、二分+spfa、树形DP+前缀和
文章目录 0 SERN的野望 1 与机关的决战 2 蜡笔 立阳二中.清华经管系贺朝 0 SERN的野望 Error! Human is dead. Mismatch. SERN妄图研发出时间机器,然而 ...
- 《惢客创业日记》2019.03.30(周六)遗留工作进入收尾阶段
自从视觉美工来了之后,我的推土机式的战略已初见成效.这为下个月打好AXURE的攻坚战做好了准备.大约再需要三.五天的时间就可以成功收尾. 说起我的推土机式的战略,主要是对之前遗留下来的五项任务做一个了 ...
- ios 多线程gdc_GDC 2019中的Heretic,Megacity版本,实时光线追踪以及更多新闻
ios 多线程gdc We kicked off GDC 2019 in the best way possible – with a keynote filled with major announ ...
- 《SRPG游戏开发》导航(2019.03.04更新)
<SRPG游戏开发>导航 第一章到第五章并没有使用Markdown,且经过CSDN几次改版和取消目录,这几章排版有些怪怪的. 2019.03.04 第十一章(十 - 十二) ,间章 第十一 ...
- 有趣的数学计算 1/9801 (结果 00,01,02,03。。。97)(使用到 BigDecimal )
有趣的数学计算 1/9801 结果 00,01,02,03...97 ■代码 package com.sxz.demo;import java.math.BigDecimal; import jav ...
- 朗润国际期货:02月03日周五《新闻联播》主要内容
02月03日周五<新闻联播>主要内容 1. [新思想引领新征程]中国经济开局稳气象新. 2. 李克强主持召开国务院全体会议讨论<政府工作报告(征求意见稿)>. 3. 李克强会见 ...
- Anaconda 2019.03 发布,Python 跨平台科学计算软件
Python 科学计算包 Anaconda 发布 2019.03 版本,详细更新日志如下: 面向用户更改 conda与Windows Powershell完美集成. Windows Python包中包 ...
- 2019.07.30 学习整理
2019.07.30 学习整理 数据类型 1. 什么是数据类型 数据类型指的就是变量值的不同类型 2. 为何对数据分类? 变量的是用来反映状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数 ...
- DayDayUp:2019.12.30吴晓波2020年终秀演讲《预见2020:来海边,拾起信心》读后有感
DayDayUp:2019.12.30吴晓波2020年终秀演讲<预见2020:来海边,拾起信心>读后有感 导读:2019年,过的好不好?有人豪情万丈,有人强颜欢笑. 互联网平台带来了方便快 ...
最新文章
- 经常可能会用到的【函数节流和函数防抖】记录下,做下区分
- 10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用...
- (轉貼) 網路***成詐騙新手法 警方提醒民眾小心 (News)
- 心急的C小加《贪心》
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第五天页脚
- 一首最接近完美的天籁之音+莎拉布莱曼《斯卡布罗集市》+
- Windows下使用pthread
- python_ 学习笔记(基础语法)
- 小程序毕设作品之微信校园维修报修小程序毕业设计成品(4)开题报告
- C标准中的转义字符以及ASC码表
- VSCode下载安装和配置Java环境
- 本地项目上传到码云gitee
- Jmeter性能测试实践--登录场景设计
- CSS Flexbox布局
- 小程序中生成带logo的二维码,有源码
- win10家庭组(win10家庭组共享打印机)
- getClass().getResourceAsStream()
- SEO的工作内容是什么?
- 台湾各个大学硕博论文链接,很全,有的可以全文下载。
- 问题 A: 相约HNUST
热门文章
- Leaflet中使用Leaflet.draw插件实现图形交互绘制和编辑(修改图形坐标点)
- Angular中怎样创建service服务来实现组件之间调用公共方法
- Android中点击按钮启动另一个Activity以及Activity之间传值
- SSM+Druid实现动态多数据源切换(已实践)
- Eclipse新建Maven项目web.xml is missing and failOnMissingWebXml is set to true错误 pox.xml编译错误
- 熟读《阿里巴巴java开发手册》(二、异常日志)
- 学习linux基础操作,从0开始入门!
- 【Python】编程笔记1
- 计算机网络总结:第三章 运输层
- python app服务器_Python应用02 Python服务器进化