美文网首页
对象的本质

对象的本质

作者: 来根黄鹤楼啊 | 来源:发表于2021-06-22 17:09 被阅读0次

    在了解对象之前先了解:Clang

    Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。 Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。

    Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器

    我们要利用Clang语句生产.cpp文件 

      用终端进入main.m路径输入:$clang -rewrite-objc main.m -o main.cpp 

    main.cpp

    在main函数中假如一个字符串属性 用来测试对象在底层

    写完之后打开.cpp文件 发现这个属性在结构体里面 struct 

    struct NSObject_IMPL NSObject_IVARS;  == isa; 在.cpp文件中 搜索会得到

    源码objc

    在源码中可以看到Class & id 都是struct 都是结构体指针 都是8字节

    arm64 位之后 isa变成了一个 结构体位域 NONPOINTER_ISA 现在的isa 基本上都是被优化过的isa 联合体位域

    ISA_MASK        0x00007ffffffffff8ULL

    通过掩码进行计算得出两个不同的内存地址 输出同一个类

    通过代码测试打印出来0x1000082d0 才是我们的类并且是一摸一样

    0x00000001000082a8是一个新的东西 并不是类

    对象 isa-> 类 isa-> 元类(系统生成和使用的mateClass)

    isa走位图

    继承链


    通过代码看到 元类 根元类  根根元类 NSObject 内存地址都是0x7fff88959fe0

    也就是对象->对象的isa->类->类的isa->元类,继承关系

    对象的结构


    源码

    要获取内存的结构

    通过x/4gx 打印出内存结构 进行分析得出和结构体 superclass、cache、bits、isa一一对应。

    源码

    在源码里面看到class_data_bits_t结构体里面看到有一个class_rw_t*data 这就是我们要的东西

    类里面声明的属性

    同理获取类里面的方法 发现取不到怎么办 看源码method_t

    取到所以的实例方法 count=6 下标从0开始 超了报错 

    相关文章

      网友评论

          本文标题:对象的本质

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