iOS面试题(十二)Runtime --基础数据结构

4.动态运行时(RunTime)

  • 基础数据结构
  • 对象、类对象、元类对象是怎么理解的?以及他们之间的关系是怎样的(实例与类对象之间的关系以及类对象与元类对象之间的关系)?
  • OC语言中的消息传递机制是怎样的?
  • 方法缓存  (我们进行方法查找的过程当中,如何进行缓存的方法查找?会使用到系统或者说Runtime中一个方法缓存的机制,这个机制又是怎样运行的呢?)
  • 消息转发流程是怎样的?
  • Method-Swizzling(方法混写)是Runtime的一种运用(我们可以再运行时,去替换一些方法的实现,也得益于动态运行时这一个特性),可能会结合实际的场景,比如说通过时长统计框架这样的考察来了解对于Runtime的Methood-Swizzling技术的一个实际的运用
  • 动态添加方法(Runtime提供的功能实现)
  • 动态方法解析(Runtime提供的功能实现)

编译时语言与Objective-C这种动态运行时语言之间的区别是什么?
消息传递与函数调用有怎样的区别?
当我们调用一个方法没有实现的时候,系统是如何为我们实现消息转发过程的?
整体Runtime数据结构
总结:

  • 首先从objc_class这么一个结构体(数据结构)开始,objc_class继承于objc_object
  • objc_object当中有一个成员变量叫isa_t,那么这个isa_t指针就指向一个objc_class类型的类对象(或者说元类对象)
  • objc_class主要包含三个成员变量,superClass(指向当前类的父类)、cache_t(用来提供消息传递过程中的缓存方法查找)、class_data_bits_t(类的一些基本信息:类所定义/通过分类所添加 的成员变量,属性,方法列表都在这个数据结构中)
    superClass:实际是class类型的,它指向objc_class类型的这样一个指针
    cache_t:实际上是装满了bucket_t数据结构的Hash表
    class_data_bits_t:实际上是对class_rw_t的数据结构的封装  class_rw_t中包含了(class_ro_t 类相关的只读信息、protocols 类分类中的协议、properties 类分类中的属性、methods 类分类中的方法) 
                                  class_ro_t包含了name类名、methodList类的方法列表 --method_t、ivars声明的类的成员变量、类的属性、类的协议    

 

Runtime基础数据结构如下 : objc_object、objc_class、isa指针、method_t

1. objc_object,即id类型(我们平时用的所有对象都是id类型的,在runtime中,id 就是 objc_object结构体)



objc_object结构体主要包含:

  1. isa_t:共用体
  2. 关于isa操作相关的一些方法:通过objc_object结构体,来获取isa所指向的类对象,或者通过类对象的isa指针获取它的元类对象一些遍历的放大
  3. 弱引用相关:标记一个对象是否曾经有过弱引用指针
  4. 关联对象相关方法:我们为对象设置了关联属性,关于关联属性的一些相关方法也体现在objc_object结构体中
  5. 内存管理相关的方法实现:MRC下经常用到的runtain,release等方法实现 ,以上均封装在objc_object结构体中

2.objc_class

OC中的Class,代表一个类,他在runtime中对应objc_class的数据结构(结构体)
objc_class继承objc_object
所以Class这样一个类也是一个对象,称为类对象,因为它继承自objc_object

objc_class包含:

  1. objc_class拥有一个superClass指针,指向class类型,(如果说Class是一个类对应的话,superClass指针指向的就是它的父类对象,就是我们平时说的类与父类,实际上是通过objc_class中superClass成员变量来定义的)。
  2. cache_t  cache成员变量: 方法缓存结构,消息传递时会使用这样的数据结构
  3. class_data_bits_t bits数据结构: 关于类所定义的变量,属性,方法都在bits这样一个成员结构中

3.isa指针

它是C++中的共用体,在OC中名称是isa_t
不论是64位架构上(或者32位架构)上面,共用体是64个(或者32个)  0或者1的数字  (按大多数64位分析)

 

分两种类型(isa指针是什么含义的时候):

  1. 指针型isa: 64位的0或者1的整体内容代表所指向的Class的地址,也就是可以通过isa的内容来获得类对象的地址
  2. 非指针型isa: isa的值得部分代表Class的地址,之所以这样是因为我们在寻址过程中,只有三四十位数就可以保证我们寻找到所有Class地址了,多出来的位可以用来存储其他相关内容,来达到节省内存的目的

isa的指向:

关于对象,它指向类对象
例如我们拥有一个实例,实例就是OC中对应的id类型,在Runtime中就是objc_object,里面有个isa指针,会指向它对应的Class

关于类对象,指向元类对象
class因为集成objc_object,所以里面也有isa指针,指向其元类对象

当我们进行方法调用时,调用一个实例的实例方法,实际上是通过isa指针,到它的类对象中,去进行方法查找
如果我们调用的是类方法,那么是通过类对象的isa指针,到它的元类对象中去查找

4.cache_t

  • 是用于快速查找方法执行函数的一个结构(当我们调用一个方法时,如果有缓存,我们就不需要去方法列表中遍历了,可以提高方法调用速度)
  • 是可增量扩展的哈希表结构(当结构存储量增大的过程中, cache_t会增量扩大它的内存空间来支持更多的缓存,用哈希表实现这个数据结构,是为了提高查找效率)
  • cache_t数据结构是计算机局部性原理的最佳应用(计算机局部性原理在一般调用方法时,有几个方法调用频次较高,把他们放到方法缓存中,下次的命中率就会更高)

cache_t具体数据结构说明:


可以理解为是数组来实现的

  • 每个对象都是bucket_t这样的一个结构体, bucket_t有两个主要成员变量,key和IMP
    key对应OC中的selector,在调用方法时是个选择器SEL
  • IMP理解为无类型的函数指针
    可以通过方法选择器的名称key来寻找这个方法的具体实现IMP

假如现在有个key,可以通过哈希查找算法来定位当前key所对应的bucket_t位于数组当中哪个位置,然后从这个位置中提取出bucket_t中的IMP

class_data_bits_t  

这个结构是objc_class中的成员结构

  • class_data_bits_t主要是对class_rw_t的封装
  • class_rw_t代表了类相关的读写信息,例如给类添加的分类的一些方法,属性以及协议等,同时它也对class_ro_t的封装,我们可以随时创建分类,为类增加属性或者方法
     rw是readWrite的简写
     ro是readOnly的意思,创建类时,添加的成员变量或方法列表在之后就没办法修改了
     class_ro_t代表了类相关的只读信息

class_rw_t

 

包含

  1. class_ro_t
  2. protocols类分类中的协议
  3. properties类分类中的属性
  4. methods类分类中的方法
    这三个数据结构是个二维数组

假如我们添加了分类A,分类A中的所有方法都在第一列竖列表中,存在二维数组的第一项
又添加了分类B,分类B中的所有方法都在第二列竖列表中,存在二维数组的第二项

class_ro_t
 


1.name:类名
2.ivars:声明的类的成员变量
3.类的属性
4.类的协议
5.类的方法列表
除1外都是一维数组
在方法列表当中存储的内容,一般是分类中添加的方法
method_t实际上是对方法的抽象说明

5.method_t

method_t是对函数四要素(名称、返回值、参数、函数体)的封装
函数四要素决定了函数的唯一性


 

method_t是个结构体,主要有三个数据类型

  1. name 函数名称
  2. types 函数返回值和参数的集合
  3. imp 无类型的函数指针,对应着函数体

types是如何表示返回值和参数的


苹果的Type Encodings技术
types成员属性,实际上表达结构是:
第一个位置永远是函数的返回值类型,后面跟着每个参数的参数类型
参数可以有多个,返回值只有一个
V@:代表types所存储的内容
V对应返回值,@对应参数1,:对应参数2

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值