「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
前言
- 类似于OC的源码分析,对于swift的研究,我们也从类的创建为出发点进行分析,然后分析类的底层结构,从而了解类的本质等等。
一、类的初探
我们先看看类的创建流程和类的大概结构
1.0 对象的创建流程
对象初始化
- OC: [[HJPerosn alloc] init],一般alloc申请内存空间并创建对象,init对象进行统一初始化处理。
- Swift: HJPerosn(),直接()就完成了对象的创建。
开启汇编调试:
例子一:在swift工程中,创建一个类继承NSObject
- 通过断点调试我们会发现:这个类的创建流程开始走 OC的流程:__allocting_init ->objc_allocWithZone...... 原因就是HJPerson 继承了NSObject,原因是跟swift的派发机制有关,后面再深入的研究。
例子二:如下不继承NSObject
-
通过断点调试我们会发现:这个类的创建流程开始走 OC的流程:__allocting_init ->swift_allocObject;
-
继续添加符号断点:
最后: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的内存结构
- 通过