目录

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相关推荐

  1. 2019.03.30【NOIP提高组】模拟 B 组 排序、二分+spfa、树形DP+前缀和

    文章目录 0 SERN的野望 1 与机关的决战 2 蜡笔 立阳二中.清华经管系贺朝 0 SERN的野望 Error! Human is dead. Mismatch. SERN妄图研发出时间机器,然而 ...

  2. 《惢客创业日记》2019.03.30(周六)遗留工作进入收尾阶段

    自从视觉美工来了之后,我的推土机式的战略已初见成效.这为下个月打好AXURE的攻坚战做好了准备.大约再需要三.五天的时间就可以成功收尾. 说起我的推土机式的战略,主要是对之前遗留下来的五项任务做一个了 ...

  3. 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 ...

  4. 《SRPG游戏开发》导航(2019.03.04更新)

    <SRPG游戏开发>导航 第一章到第五章并没有使用Markdown,且经过CSDN几次改版和取消目录,这几章排版有些怪怪的. 2019.03.04 第十一章(十 - 十二) ,间章 第十一 ...

  5. 有趣的数学计算  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 ...

  6. 朗润国际期货:02月03日周五《新闻联播》主要内容

    02月03日周五<新闻联播>主要内容 1. [新思想引领新征程]中国经济开局稳气象新. 2. 李克强主持召开国务院全体会议讨论<政府工作报告(征求意见稿)>. 3. 李克强会见 ...

  7. Anaconda 2019.03 发布,Python 跨平台科学计算软件

    Python 科学计算包 Anaconda 发布 2019.03 版本,详细更新日志如下: 面向用户更改 conda与Windows Powershell完美集成. Windows Python包中包 ...

  8. 2019.07.30 学习整理

    2019.07.30 学习整理 数据类型 1. 什么是数据类型 数据类型指的就是变量值的不同类型 2. 为何对数据分类? 变量的是用来反映状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数 ...

  9. DayDayUp:2019.12.30吴晓波2020年终秀演讲《预见2020:来海边,拾起信心》读后有感

    DayDayUp:2019.12.30吴晓波2020年终秀演讲<预见2020:来海边,拾起信心>读后有感 导读:2019年,过的好不好?有人豪情万丈,有人强颜欢笑. 互联网平台带来了方便快 ...

最新文章

  1. 经常可能会用到的【函数节流和函数防抖】记录下,做下区分
  2. 10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用...
  3. (轉貼) 網路***成詐騙新手法 警方提醒民眾小心 (News)
  4. 心急的C小加《贪心》
  5. 学习响应式BootStrap来写融职教育网站,Bootsrtap第五天页脚
  6. 一首最接近完美的天籁之音+莎拉布莱曼《斯卡布罗集市》+
  7. Windows下使用pthread
  8. python_ 学习笔记(基础语法)
  9. 小程序毕设作品之微信校园维修报修小程序毕业设计成品(4)开题报告
  10. C标准中的转义字符以及ASC码表
  11. VSCode下载安装和配置Java环境
  12. 本地项目上传到码云gitee
  13. Jmeter性能测试实践--登录场景设计
  14. CSS Flexbox布局
  15. 小程序中生成带logo的二维码,有源码
  16. win10家庭组(win10家庭组共享打印机)
  17. getClass().getResourceAsStream()
  18. SEO的工作内容是什么?
  19. 台湾各个大学硕博论文链接,很全,有的可以全文下载。
  20. 问题 A: 相约HNUST

热门文章

  1. Leaflet中使用Leaflet.draw插件实现图形交互绘制和编辑(修改图形坐标点)
  2. Angular中怎样创建service服务来实现组件之间调用公共方法
  3. Android中点击按钮启动另一个Activity以及Activity之间传值
  4. SSM+Druid实现动态多数据源切换(已实践)
  5. Eclipse新建Maven项目web.xml is missing and failOnMissingWebXml is set to true错误 pox.xml编译错误
  6. 熟读《阿里巴巴java开发手册》(二、异常日志)
  7. 学习linux基础操作,从0开始入门!
  8. 【Python】编程笔记1
  9. 计算机网络总结:第三章 运输层
  10. python app服务器_Python应用02 Python服务器进化