[Swift拓展]4、指针&内存
2024-04-03 本文已影响0人
史记_d5da
1、内存管理
Swift是通过引用计数(ARC)来管理内存的
1.1、swift源码查看
查找过程如下
1、HeapObject
类中的 refCounts
变量记录引用计数
![](https://img.haomeiwen.com/i13018511/d2384e03036bbaa8.png)
2、
InlineRefCounts
为模板类,类型为RefCounts<InlineRefCountBits>
![](https://img.haomeiwen.com/i13018511/bbca4cee1794433e.png)
3、
RefCounts
类内部存储了InlineRefCountBits
![](https://img.haomeiwen.com/i13018511/44ac7224d30ebd12.png)
4、查找
InlineRefCountBits
,InlineRefCountBits
由泛型RefCountBitsT<RefCountIsInline>
类型定义![](https://img.haomeiwen.com/i13018511/86ca4226fdfa49b7.png)
5、最终查找类
RefCountBitsT
,构造函数为RefCountBitsT()
![](https://img.haomeiwen.com/i13018511/7a726bca95b1a70b.png)
6、通过查找64位结构体,查找到对应的值
![](https://img.haomeiwen.com/i13018511/aa9e3c482712c662.png)
RefCountBitsT
函数对应的入参位域运算分别如下strongExtraCount
: 0unownedCount
: 1StrongExtraRefCountShift
: 33,(左移33位)(强引用次数)PureSwiftDeallocShift
: 1,(左移0位)(析构次数)UnownedRefCountShift
: 1,(左移1位)(无主引用次数)
1.2、代码实际操作
1、如下的代码断点查看
![](https://img.haomeiwen.com/i13018511/c89c5385e5fae455.png)
断点在108处,
0x0000000400000003
![](https://img.haomeiwen.com/i13018511/7faf0b46afa25934.png)
结合上面的
RefCountBitsT
函数,0x0000000400000003
,代表PureSwiftDeallocShift
为1,UnownedRefCountShift
为1,StrongExtraRefCountShift
为2![](https://img.haomeiwen.com/i13018511/e850eacd8b8dce91.png)