Swift中,如何准确查看类对象在内存中的引用计数?

问题描述 投票:0回答:0

英语不是我的母语,所以请原谅任何打字错误。我正在为我的问题使用翻译器。

看了《WWDC16 - Understanding Swift Performance》了解到,在堆上为类分配内存时,比在栈上多分配2个字

2个字的第一个字是指向那个类的类型信息的指针,第二个字是引用计数

为了验证这一点,我写了下面的代码:

class RefType {
    var num1: Int
    var num2: Int

    init(num1: Int, num2: Int) {
        self.num1 = num1
        self.num2 = num2
    }
}

func test() {
    var ref1 = RefType(num1: 5, num2: 9) // 03 00
    var ref2 = ref1 // 03 02

    print(Unmanaged.passUnretained(ref1).toOpaque()) // 0x0000600000206a00
    print("job done") // <- breakpoint
}

test()

通过

ref1
地址查看内存,得到如下结果:

result1 image

以为创建类时传入的值

05
09
被赋值,
05
前面的词代表引用计数(第二块蓝色高亮)

为了确保,我添加了另一个引用

ref1
的变量并编写了提供的代码。

var ref1 = RefType(num1: 5, num2: 9) // 03 00
var ref2 = ref1 // 03 02
var ref3 = ref1 // added

虽然期望引用计数增加 1 并变为

03
,但它却是
04

result2 image

我不明白为什么每次添加新引用时它都会增加 2,以及前 4 个字节的

03 00 00 00
是什么意思??

总结

  1. 虽然我明白蓝色高亮部分代表的是类的引用计数,但是不知道前4个字节指向的值(
    03
    )是什么意思
  2. 很好奇为什么引用数会随着引用数的增加而增加2

我是新来的,信誉不够,只好用链接替换图片。感谢您的理解。

swift memory-management reference-counting
© www.soinside.com 2019 - 2024. All rights reserved.