iOS编程中isa指针详解
isa指针:
OC是一门面向对象的语言,每一个对象都是类的一个实例。在objective-c语言的内部,每一个对象都有一个isa指针,指向该指针的类。每一个类描述了一系例他的实例的特点,包括成员变量的列表,成员函数的列表。每一个对象都可以接收消息,而对象接收消息列表保存在他所对应的类中。
当我们初始化一个对象的时候,是怎么发送消息的
NSObject *obj=[[NSObject alloc] init];
调用方法,其实是给对象发送消息,在编译时这句话会翻译成一个C的函数调用,即:
objc_msgSend(objc_msgSend([NSObject class],@selector(alloc)),@selector(init));
使用这个函数的需要引入头文件:
#import <objc/message.h>
那不是把 OC代码转换成C。c语言函数在调用编译的时候就会决定调用哪个函数,而oc是一种动态语言,他会尽可能把代码的从编译链接是推迟到运行时,这就是oc运行时多态。
给一个对象发送消息,并不会立即执行,而是在运行的时候在去寻找他对应的实现
在Xcode中打开,NSObject.h和objc.h,我们可以看到,NSObject就是一个包含isa指针的结构体,按照面向对象的设计原则,所有的事物都应该是对象,所以严格的说oc并不是完全面向对象的(应为含有int double 类型的变量)。在oc语言中,每一个类实际上也是一个对象。每一个类也有一个isa指针。每一个类也可以接收消息,例如代码[NSObject alloc],就是向NSObject这个类发送名为 “alloc” 的消息。
在oc中,因为类也是一个对象,所以也必须是另外一个类的实例,这个类就是元类(metaclass)。元类保存了类方法的列表。当一个类方法被调用的时候,元类会首先查找他本身是否有该方法的实现,如果没有,则元类会向他的父类查找方法,这样就可以一直找到继承链的头。
元类也是一个对象,元类的isa指针又指向哪里呢?为了设计的完整性,所有的元类的isa指针都会指向一个根元类。根元类的isa指针又会指向他自己,这样就形成了一个闭环。
架构图片.png