id的本质

简介: id的本质

1.id的本质是什么?

说到id 就是跟SEL一样 id也被定义在Objc/objc.h目录下

typedef struct objc_object*id

说到id它是一个结构体指针类型,它可以指向Objective-C的中的任何对象.objc_object结构体

struct objc_object{Class isa OBJC_ISA_AVAILABILITY}

我们通常说的对象,就是长这个样子,这个结构体只有一个成员变量isa ,对象可以通过isa指针找到其所属的类,isa指针是一个class类型的成员变量.

说到class也是一个结构体指针类型

它的原型是这样的typedef struct objc_class *Class

class 也有一个isa指针,指向所属的元类(meta).

super _class 是指向超类

name: 是类名

version 是类的版本信息

info 是类的详情

instance_size 是指的该类的实例对象的大小

dinars指向该类的成员变量列表

methodLists: 指向该类的实例方法列表,它将方法选择器和方法实现地址联系起来,methodlists是指向objc_mthod_list指针的指针,也就是说可以动态的修改*methdLists 的值来添加成员方法,这也就是分类可以增加方法不可增加属性的原因了.

cache: Runtime系统会把调用的方法存到cache中(理论上将一个方法如果被调用者,那么它有可能今后还会被调用),下次查找的时候效率更高

protocols:指向该类的协议列表

也就是当我们调用一个方法时,其运行过程大致如下:

Rumtime系统会把方法调换转化为方法发送,就objc_megSend,并且把方法的调用者,和方法选择器,当做参数传递过去.

此时,方法的调用者会通过isa指针来找到其所属的类,然后在cache或者methodLists中查找该方法,找得到就会跳到对应的方法去执行.

如果在类中没有找到该方法,就会去super_calss父类里面找,一直找到NSObjc.没有找到就报错

内容参考自objc中国


相关文章
|
5月前
|
存储 NoSQL 数据库
全局id生成方式
全局id生成方式
|
10月前
获取两个list中相互不包含的部分
获取两个list中相互不包含的部分
109 0
|
6天前
|
数据库 Python
现在有个外键值是area_id_id,我就想他叫area_id该怎么做
现在有个外键值是area_id_id,我就想他叫area_id该怎么做
|
2月前
|
存储 Python
set() 和 freezeset() 之间有什么区别?
【8月更文挑战第29天】
20 6
|
5月前
|
JavaScript 算法
v-for中key的原理和作用
为什么在使用v-for循环渲染列表时,应始终为每个列表项提供一个唯一的key属性? `使用v-for时加上key属性是为了提高渲染列表时的性能和效率。`
|
5月前
|
算法 NoSQL 关系型数据库
9种 分布式ID生成方式
9种 分布式ID生成方式
508 0
C#中out和ref之间的区别
C#中out和ref之间的区别
|
SQL 数据采集 NoSQL
One ID中的核心技术ID-Mapping究竟是怎么实现的?
One ID中的核心技术ID-Mapping究竟是怎么实现的?
|
SQL 机器学习/深度学习 算法
如何判断多账号是同一个人?用图技术搞定 ID Mapping
如何判断多个账号,它可能是一个邮箱,一个地址,一个手机对应着多个 ID,或者是多个同一前缀的邮箱,背后是同一个用户。如何进行这种关联性信息的收集,判断这些信息归属于同一人呢?
384 0
如何判断多账号是同一个人?用图技术搞定 ID Mapping
使用Stream 对List同一个id的某个字段进行计算
使用Stream 对List同一个id的某个字段进行计算
95 0