id的本质

2016-09-27  本文已影响29人  指尖猿

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中国

上一篇下一篇

猜你喜欢

热点阅读