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

时间:2018-08-24 23:14:58

标签: swift class reference-type

我在操场上进行了以下设置,并希望最后两个内存地址相同。我将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

2 个答案:

答案 0 :(得分:2)

这是一个表,随着代码的进行,该表跟踪对象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

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

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

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

Object graph showing reference type aliasing.

答案 1 :(得分:1)

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

创建person1后,它就是类Person的实例。 person1是指向该实例中代表该内存的位置的指针/引用。

然后您实例化var person2 = person1,因此person2成为指向内存中相同位置的另一个指针。但是它们是两个不同/独立的指针。

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