美文网首页
类的结构分析

类的结构分析

作者: CrazySnow | 来源:发表于2020-09-14 18:14 被阅读0次

什么是元类

  • 我们都知道 对象的isa是指向类,的其实也是一个对象,可以称为类对象,其isa的位域指向苹果定义的元类

  • 元类是系统给的,其定义和创建都是由编译器完成,在这个过程中,类的归属来自于元类

  • 元类 是类对象 的类,每个类都有一个独一无二的元类用来存储类方法的相关信息。

  • 元类本身是没有名称的,由于与类相关联,所以使用了同类名一样的名称

isa走位
对象的isa—>类(也叫类对象
类的isa—>元类
元类的isa—>NSObject(根元类)
NSObject的isa —>NSObject(他自己)

*内存中有且仅有一个NSObject,根元类的元类指向他自己

isa走位.png

objc_class & objc_object

对象和类都有isa,其中有什么联系

  • 类的isa是有objc_class定义的指针类型
  • objc_class是一个结构体,在iOS中,所有的class都是以objc_class为模版创建的
struct NSObject_IMPL {
    Class isa;
};

typedef struct objc_class *Class;

objc_class的定义:

struct objc_class : objc_object {//objc_class继承自objc_object
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {
        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }

    void setInfo(uint32_t set) {
        ASSERT(isFuture()  ||  isRealized());
        data()->setFlags(set);
    }

    void clearInfo(uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        data()->clearFlags(clear);
    }

    // set and clear must not overlap
    void changeInfo(uint32_t set, uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        ASSERT((set & clear) == 0);
        data()->changeFlags(set, clear);
    }

objc_classobjc_object的关系:

  • 结构体类型objc_class 继承自objc_object类型,其中objc_object也是一个结构体,且有一个isa属性,所以objc_class也拥有了isa属性
    ⬇️
  • mian.cpp底层编译文件中,NSObject中的isa在底层是由Class 定义的,其中class的底层编码来自 objc_class类型,所以NSObject也拥有了isa属性
    ⬇️
  • NSObject 是一个类,用它初始化一个实例对象objcobjc 满足objc_object的特性(即有isa属性),主要是因为isa 是由 NSObjectobjc_class继承过来的,而objc_class继承自objc_objectobjc_objectisa属性。所以对象都有一个 isaisa表示指向,来自于当前的objc_object
    ⬇️
  • objc_object(结构体) 是 当前的 根对象,所有的对象都有这样一个特性 objc_object,即拥有isa属性

面试题:
objc_object对象的关系

  • 所有的对象 都是以 objc_object为模板继承过来的

  • 所有的对象 是 来自 NSObject(OC) ,但是真正到底层的 是一个objc_object(C/C++)的结构体类型

【总结】 objc_object对象的关系是继承关系

内存

  • 与内存相关的名词解析
    对象指针:指向类的成员的指针。在C++中,可以说明指向类的数据成员和成员函数的指针。
    对象内存地址:对象存储位置的地址,相当于门牌号一样
    指针:指针变量就是一个变量,这个变量本身要存储在内存中,指针变量所在内存中存储的就是这个指针变量所指向的地址
    指针地址:本身也是指针变量,此变量指向的地址中存储的是指针的地址
//对象
    CJLPerson *p1 = [CJLPerson alloc]; // p1 是指针
    CJLPerson *p2 = [CJLPerson alloc];
    NSLog(@"%d -- %p", p1, &p1);
    NSLog(@"%d -- %p", p2, &p2);
  • p1、p2 是指针,p1 是 指向 [CJLPerson alloc]创建的空间地址,即内存地址,p2 同理

  • &p1、&p2是 指向 p1p2对象指针的地址,这个指针就是二级指针

    指针详解.png

相关文章

  • iOS 类原理探索:类的结构分析

    OC 类原理探索 系列文章 OC 类原理探索:类的结构分析 OC 类原理探索:类结构分析补充[https://ju...

  • 多线程基础(十三):java中的FutureTask

    [toc] FutureTask源码分析 1.类结构及常量、变量 1.1 类结构 FutureTask类结构如下:...

  • iOS类结构:cache_t分析

    一、cache_t 内部结构分析 1.1 在iOS类的结构分析中,我们已经分析过类(Class)的本质是一个结构体...

  • 类,类结构分析

    忙不是不学习的借口 在isa和类的关联[https://www.jianshu.com/p/079a6ad90f1...

  • iOS-OC底层04:类结构分析

    类结构分析 通过lldb来分析类结构 查看objc2的内存情况 类对象只有一份,isa对象-> 类(LGPerso...

  • iOS-底层分析之类的结构分析

    类的结构分析 本文主要分析iOS中的类以及类的结构,下面我们通过一个例子来探索类的结构 我们定义一个WPerson...

  • 类结构分析

    这片文章主要分析的是类的结构以及对象-类-元类-根元类之间的走位. 一. isa的指向以及类之间的关系 准备工作定...

  • 类结构分析

    类结构分析 回顾 前面我们讲了alloc 流程中对象的创建过程,下面我们来探索一下类的结构,废话不多说,开始~ 类...

  • 类结构分析

    开发中经常创建一个 TestClass.h 和 TestClass.m 文件,而这个 TestClass 就是我们...

  • 类的结构分析

    神图镇楼,相信做过iOS开发的同学一定非常熟悉这张经典图,每次看这张图都有不一样的体会,今天我们就借这张图,引出我...

网友评论

      本文标题:类的结构分析

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