为什么指向新对象后内存地址相同?

Why is memory address the same after pointing at new Object?

我在操场上进行了以下设置,希望最后两个内存地址相同。我将 person2 指向 person1 然后 person1 被重新分配给一个新的 Person 所以 person2 应该具有与 person1 相同的内存地址。

为什么它与我们第一次分配时的地址相同?

class Person {
  var name = ""
}

var person1 = Person()
print(Unmanaged.passUnretained(person1).toOpaque())
//0x0000600000043ea0

var person2 = person1

person1 = Person()
print(Unmanaged.passUnretained(person1).toOpaque())
//0x00006000000568f0
print(Unmanaged.passUnretained(person2).toOpaque())
//0x0000600000043ea0

这就是引用类型在 Swift 中的工作方式。

当您创建 person1 时,它是 class Person 的一个实例。 person1 然后是 pointer/reference 到内存中代表该实例的位置。

然后你实例化var person2 = person1,所以person2变成另一个指向内存中相同位置的指针。但它们是两个 different/independant 指针。

person1 = Person() 更改了内存中 person1 指向的位置:class Person 的新实例。您尚未更新 person2 指向的实例。

这里有一个 table 跟踪对象 person1person2 指向,随着代码的进行:

// code                   | person1 points to: | person2 points to: 
// -----------------------+--------------------+--------------------
// start                  | 0xXXXXXXXXXXXXXXXX | 0xXXXXXXXXXXXXXXXX
var person1 = Person() // | 0x0000600000043ea0 | 0xXXXXXXXXXXXXXXXX
let person2 = person1  // | 0x0000600000043ea0 | 0x0000600000043ea0
person1 = Person()     // | 0x00006000000568f0 | 0x0000600000043ea0

Xs 代表未初始化的内存,它可以有任何值(来自之前存储的任何值)。

person1person2是变量,存储在栈中,其内容是(引用)Person对象的地址。为了清楚起见,我们给 Person 个对象命名:

  • 人物对象 X,位于 0x0000600000043ea0
  • 人物对象 Y,位于 0x00006000000568f0