美文网首页
003-iOS 对象的本质和isa探索

003-iOS 对象的本质和isa探索

作者: A慢慢懂 | 来源:发表于2020-09-21 07:00 被阅读0次

一、Clang

  • Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。 Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
  • Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。
    用终端输入clang -rewrite-objc main.m -o main.cpp,将main文件编译成cpp文件。-o为输出

二、对象的本质

探索的对象本质的步骤

2.1创建项目

15998947394983.jpg

2.2在main.m添加代码

@interface Student : NSObject
@end
@implementation Student
@end

2.3生成main.cpp文件

在main的根目录下,点击go2Shell文件,输入clang -rewrite-objc main.m -o main.cpp,将main.m文件编译成cpp文件。

15998956650604.jpg

2.4查看main.cpp文件

15998959278254.jpg

编译成了结构体。

2.5添加属性,再探cpp文件
@property(nonatomic,strong)NSString *stuName;
@property(nonatomic,strong)NSString *stuSex;
15998978469498.jpg
结构体struct Student_IMPL
struct Student_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    NSString *_stuName;
    NSString *_stuSex;
};

set方法

  • static NSString * _I_Student_stuName
  • static NSString * _I_Student_stuSex

get方法

  • static void I_Student_setStuName
  • static void I_Student_setStuSex

底层代码中,Student被编译成了结构体存在,其属性成为结构体中变量存在,有set和get方法。对象的本质其实是结构体。

三、ISA的结构

源码文件https://github.com/zhaimengting/objc4
isa.h文件

# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD                                                      \
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t has_cxx_dtor      : 1;                                       \
      uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
      uintptr_t magic             : 6;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t deallocating      : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

  • nonpointer:表示是否对isa指针开启指针优化,0表示纯isa指针,1:不止是类对象地址,isa中包含了类信息、对象的引用计数。占一个位
  • has_assoc :标识关联对象,0没有,1存在。
  • has_cxx_dtor:该对象是否有 C++ 或者 Objc 的析构器,如果有析构函数,则需要做析构逻辑,
    如果没有,则可以更快的释放对象
  • shiftcls:存储了类指针的值,开启优化的状态下,在arm64架构中有33位来存储类指针。
  • magic:用于调试器判断当前对象是真的对象,或者是没有初始化的空间
  • weakly_referenced:指对象是否是否被指向或者指向一个ARC的弱变量,没有弱引用的对象可以更快的释放。
  • deallocating:标识对象是否正在释放内存。
  • has_sidetable_rc:当对象引用计数大于10时,则需要借用该变量存储进位。
  • extra_rc: 表示该对象的引用计数值,实际上是引用计数值减1,例如如果对象的计数引用为10,那么extra_rc为9,如果大于10,则需要用到上面的has_sidetable_rc.
    探索未完待续~

相关文章

  • 003-iOS 对象的本质和isa探索

    一、Clang Clang是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下...

  • OC_底层_isa探究

    isa与类关联的原理 OC对象的本质 先简单简介llbd相关知识: 在代码中探索对象本质: 在 main.cpp ...

  • 类的结构分析

    isa继续探索 在对象探索-初探isa文章中,简单探索了isa的构成,这篇文章主要将isa之间的关系及类的内存结构...

  • ISA指向、类结构

    ISA指向、类结构 1.ISA指向 上次在对象本质和ISA指针[https://www.jianshu.com/p...

  • iOS底层原理之消息发送

    1.方法的本质 1.1 探索 在之前的文章中,我们探索了对象、类、以及isa等的本质,那么今天我们一起来分析一下方...

  • OC 对象原理探索(三):对象的本质 & isa

    1. 联合体、位域 1.1 结构体 先看下面的代码: 我们看到一个SSLCar结构体是4个字节,也就是32位(00...

  • 对象本质和ISA指针

    1.什么是对象? 这是NSObject的声明,里面只有一个Class类型的isa变量,声明一个继承NSObject...

  • iOS底层原理探究 - 对象的本质和isa探索

    前言 我们都知道OC是一门面向对象的开发语言,那么在开发中免不了经常会提起的一个词,就是对象。我们也经常会说万物皆...

  • OC中类的本质

    OC中的对象的本质 对象本身是一个含有isa指针的结构体,isa指针指向对象所属的类类的本质:类本质也是一个结构体...

  • OC对象的本质

    OC对象的本质 一个对象的本质是一个结构体,结构体里面有isa指针、成员变量等,isa指针指向对象的类别,inst...

网友评论

      本文标题:003-iOS 对象的本质和isa探索

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