iOS isa指针

作者: kindom_0129 | 来源:发表于2019-08-27 10:34 被阅读0次

    isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * ,这是苹果在下面的注释中写到的。这说明类本身也是一个对象。在类对象中的 isa 指向的类叫做“元类”,类方法就定义在元类中。总的来说就是,一个类可以有很多的实例,这些实例有着唯一的一个类对象,而这个类对象也有着唯一的一个元类。

    实例,类,父类,元类之间的关系

    Class super_class
    super_class 指向的就是它的父类。
    struct objc_ivar_list *ivars
    ivars 指向的是成员变量的列表。
    struct objc_method_list **methodLists
    methodLists 指向的就是方法的列表。在 method_list 中存着 objc_method 类型的数组。而 objc_method 的定义如下:

    struct objc_method {
        SEL method_name ;
        char *method_types ;
        IMP method_imp ;
    }
    

    typedef id (*IMP)(id, SEL, ...); // IMP 就是一个函数指针
    看到这个结构体, 我们应该就很明确 selector 的意义了:selector 其实就是方法的一个标示,而 method_imp 指向的才是真正的函数实现。当我们向对象发送消息后, runtime根据 selector 这个标示,在method_list中找到对应的 objc_method,取到真正的函数的地址,再执行。

    struct objc_cache *cache
    cache 用来缓存最近调用过的的方法。 如果每次向对象发送消息都要遍历一遍方法列表那会很浪费时间, 所以会把最近调用过的方法放在缓存中。每一次发送消息时,会先查询缓存,缓存中找不到再去方法列表中找。

    struct objc_protocol_list *protocols
    protocols 指向协议列表。

    相关文章

      网友评论

        本文标题:iOS isa指针

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