swift 类的结构1

132 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

前言

  • 类似于OC的源码分析,对于swift的研究,我们也从类的创建为出发点进行分析,然后分析类的底层结构,从而了解类的本质等等。

一、类的初探

我们先看看类的创建流程和类的大概结构

1.0 对象的创建流程

对象初始化

  • OC: [[HJPerosn alloc] init],一般alloc申请内存空间并创建对象,init对象进行统一初始化处理。
  • Swift: HJPerosn(),直接()就完成了对象的创建。

开启汇编调试:

image.png

例子一:在swift工程中,创建一个类继承NSObject

image.png

  • 通过断点调试我们会发现:这个类的创建流程开始走 OC的流程:__allocting_init ->objc_allocWithZone...... 原因就是HJPerson 继承了NSObject,原因是跟swift的派发机制有关,后面再深入的研究。

例子二:如下不继承NSObject

image.png

  • 通过断点调试我们会发现:这个类的创建流程开始走 OC的流程:__allocting_init ->swift_allocObject;

  • 继续添加符号断点:

image.png

最后:swift对象创建流程:

__allocating_init -> swift_allocObject -> swift_allocObject -> swift_slowAlloc ->...

在VSCode中的源码里,根据此流程逐渐对其源码进行分析如下:

1.1 swift_allocObject 源码分析
static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
                                       size_t requiredSize,
                                       size_t requiredAlignmentMask) {
  assert(isAlignmentMask(requiredAlignmentMask));
  auto object = reinterpret_cast<HeapObject *>(
      swift_slowAlloc(requiredSize, requiredAlignmentMask));//分配内存+字节对齐

 //注意:这依赖于c++ 17保证的无空指针语义
//检查我们在Windows上观察到的新分配器的位置,
// Linux和macOS。
  new (object) HeapObject(metadata);//初始化一个实例对象

  //如果启用了泄漏跟踪,请开始跟踪此对象。
  SWIFT_LEAKS_START_TRACKING_OBJECT(object);

  SWIFT_RT_TRACK_INVOCATION(object, swift_allocObject);

  return object;
}
  • swift_allocObject的源码如下,主要有以下几部分

    • 通过swift_slowAlloc分配内存,并进行内存字节对齐
    • 通过new + HeapObject + metadata初始化一个实例对象
    • 函数的返回值是HeapObject类型,所以当前对象的内存结构就是HeapObject的内存结构