美文网首页学习OC 底层
iOS中isa的深层理解

iOS中isa的深层理解

作者: 面朝对象_春暖花开 | 来源:发表于2017-02-16 17:02 被阅读947次

我之前的isa理解不透彻,现在重新梳理我对iOS底层object的理解.(只代表个人理解).

在<objc.h>中我们可以看到:

typedef struct objc_class *Class;
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

解释这段代码: objc_object中有一个Class类型的属性isa,而Class是一个指向objc_class的指针,存放着一个objc_class的地址. id是一个指向objc_object的指针.那objc_class是个什么东西呢?
在<objc/runtime.h>中我们看到:

(这里struct类型是c++对c的扩展,除了访问权限是public之外其他的和class一模一样)
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

解释这段代码: objc_class中也有一个isa指针,这个指针不是指向自己而是mateclass(元类),简单介绍一下元类的概念

元类是类对象的类,类对象是元类的实例。基于这种设计模式,不难发现:
1.我们以前调用 "+" 开头的类方法实际是在调用元类的对象方法
2.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例
那么,元类是对象吗?
答案是肯定的,元类是对象。
如果元类也是对象,元类的类又是什么?
下图解释:
329694-69a689f166a7c256.png
//    model * zyn = [[model alloc]init];
    Class metaClass_parent = objc_getMetaClass("model_parent");
    Class metaClass_child = objc_getMetaClass("model_child.h");
    Class superClass_metaClass_parent = class_getSuperclass(metaClass_parent);
    Class superClass_metaClass_child = class_getSuperclass(metaClass_child);
    Class metaClass_NSObject = objc_getMetaClass("NSObject");
    Class superClass_metaClass_NSObject = class_getSuperclass(metaClass_NSObject);

结果:下图


屏幕快照 2017-02-16 下午4.55.52.png
其实到这就明白了:
1 , objc_object中的isa 指的是对象的类;
2 , objc_class中的isa只的是类的元类;
3 , superClass是一层层集成的,到最后NSObject的superClass是nil.而NSObject的isa指向根元类,这个跟元类的isa指向它自己,而它的superClass是NSObject,也就是最后形成一个环,这个环让我想起了先有鸡还是先有蛋的问题.
4 , mateClass也是相互继承的.
5 , 这个逻辑就想着objc_class的struct,里面有个isa属性,还有个super_class属性,他俩都是指针,其实在objc_class的定义中也能看出来,每一个objc_class都有isa,但是不一定会有super_class,近三天每天想一次.

相关文章

  • iOS中isa的深层理解

    我之前的isa理解不透彻,现在重新梳理我对iOS底层object的理解.(只代表个人理解). 在中...

  • iOS isa深入理解之isa指向流程

    一、前言 在我的上一篇博客iOS isa初步理解之实例的isa说到,通过[NSObject alloc]创建的实例...

  • iOS底层-isa结构(isa_t)

    在iOS 底层-- isa指向探究中探索了isa的指向,那么isa的结构具体是什么样的。从源码中来着手研究。 一、...

  • iOS isa初步理解之实例的isa

    前言 在iOS开发过程中,最最常见的就是类、对象。分析isa对理解OC类、对象是非常重要的。 一、准备 1、我们先...

  • isa结构解析

    1. isa初始化 在 iOS alloc原理分析 中会 initInstanceIsa中初始化isa,源码如下:...

  • IOS - 64位中 isa 区域的变化

    原文链接 不再是指针的 isa 在 iOS arm64 的架构中,属于 Objective-C 对象的 isa 空...

  • ISA的结构详解

    一,isa 的作用 在iOS开发过程中,我们知道,任何一个对象都有一个isa,通过isa 指向,可以找到父类,以及...

  • iOS底层原理--类的结构分析

    在前一篇文章中,我们已经探讨了iOS底层原理--isa与类关联的原理,isa包含了Class类,从而将isa与Cl...

  • iOS Objective-C isa简介

    iOS Objective-C isa 1.isa简介 isa是 Objective—C 对象alloc的时候,伴...

  • 深入理解iOS开发中的isa指针

    深入代码理解instance、class object、metaclass 面向对象编程中,最重要的概念就是类,下...

网友评论

    本文标题:iOS中isa的深层理解

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