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

一、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探索)