iOS消息发送流程

news/2024/7/20 21:07:57 标签: ios, 面试, 消息发送, objc_msgSend
        Objc的方法调用基于消息发送机制。即Objc中的方法调用,在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中, 实例对象的方法主要存储在类的方法列表中,类方法则是主要存储在原类中。

     向对象发送消息,核心就是找到对应的方法,然后传入参数执行。

     其具体过程是:

  1. 确定class已经加载
  2. 从cache中通过hash查找方法
  3. 从类的方法列表中查找
  4. 从父类中查找
  5. 若方法列表是排序过的, 则采用二分法查找;若方法列表未排序,则采用遍历查找。
  6. 若找到方法,执行之;否则,进入消息转发流程。

     需要注意的是, 向super对象发送消息,调用的不是objc_msgSend方法。

NSLog(@"NSStringFromClass([self class])=%@",NSStringFromClass([self class]));
NSLog(@"NSStringFromClass([super class])=%@",NSStringFromClass([super class]));

打印结果:
NSStringFromClass([self class])=BankViewController
NSStringFromClass([super class])=BankViewController

       为什么 [super class]返回的也是BankViewController呢? 这是因为, super结构体中的receiver指针其实指向的也是self,只是向super发送消息调用的是objc_msgSendSuper方法,该方法在执行消息传递时,会调用查找自己类中的方法,直接从父类开始查找。 


http://www.niftyadmin.cn/n/5401750.html

相关文章

java 正则表达式介绍

Java正则表达式是一种强大的文本处理工具,它允许你进行模式匹配、搜索和文本操作。正则表达式提供了一种简洁、灵活的方式来处理字符串,可以用于各种应用场景,如数据验证、文本解析、搜索和替换等。 正则表达式的基础知识 正则表达式…

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域) 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…

全量知识系统问题及SmartChat给出的答复 之10 三套工具之5语法解析器之3

Q27. 从前面可以看出,IPP解析器给出两种文法规则,一种是人工的(文字处理和文本理解),一种是机器的(图形算法和图像处理)。前者可以是一套文写文章的注释工具的底层,可以使用颜色来着…

c语言之字符串输入输出函数 puts函数,gets函数,strcat函数

puts函数 puts函数语法是puts(字符串) puts函数会自动将末尾的\0转为\n&#xff0c;也就是换行符 示例代码如下 #include<stdio.h> int main() {char a[30]"I Love China!";puts(a);return 0; } gets函数 这个函数是输入字符 gets函数语法格式是gets&am…

MySQL 主从读写分离入门——基本原理以及ProxySQL的简单使用

一、读写分离工作原理 读写分离的工作原理&#xff1a;在大型网站业务中&#xff0c;当单台数据库无法满足并发需求时&#xff0c;通过主从同步方式同步数据。设置一台主服务器负责增、删、改&#xff0c;多台从服务器负责查询&#xff0c;从服务器从主服务器同步数据以保持一…

YOLO算法改进Backbone系列之:PVTv2

摘要&#xff1a;最近&#xff0c;Transformer在计算机视觉方面取得了令人鼓舞的进展。在本研究中&#xff0c;本文通过增加(1)线性复杂度注意层、(2)重叠贴片嵌入和(3)卷积前馈网络三种设计&#xff0c;改进了原始的金字塔视觉转换器(PVT v1)&#xff0c;提出了新的基线。通过…

sqllabs第五关floor报错注入

实验环境sqllabs第五关 floor()报错注入的原因是group by在向临时表插入数据时&#xff0c;由于rand()多次计算导致插入临时表时主键重复&#xff0c;从而报错&#xff0c;又因为报错前concat()中的SQL语句或函数被执行&#xff0c;所以该语句报错且被抛出的主键是SQL语句或函…

leetcode-字符串相加

415. 字符串相加 题目中已经说明不能使用库函数直接将输入的字符串转换为整数。这就需要我们自己实现大数加法的逻辑&#xff0c;我们可以从两个字符串的最后一位开始&#xff0c;逐位相加&#xff0c;同时记录进位。如果某一位相加的结果超过10&#xff0c;那么需要向前进位。…