美文网首页
iOS编程中isa指针详解

iOS编程中isa指针详解

作者: 单线程Jack | 来源:发表于2019-08-16 15:18 被阅读0次

    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

    相关文章

      网友评论

          本文标题:iOS编程中isa指针详解

          本文链接:https://www.haomeiwen.com/subject/oitqsctx.html