我在操场上进行了以下设置,并希望最后两个内存地址相同。我将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
答案 0 :(得分:2)
这是一个表,随着代码的进行,该表跟踪对象person1
和person2
指向的对象:
// 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
代表未初始化的内存,该内存可以具有任何值(来自之前存储的值)。
person1
和person2
是变量,它们存储在堆栈中,其内容是Person
对象的(引用)对象的地址。为了清楚起见,让我们给Person
对象命名:
X
,位于0x0000600000043ea0 Y
,位于0x00006000000568f0 答案 1 :(得分:1)
这就是引用类型在Swift中的工作方式。
创建person1
后,它就是类Person
的实例。 person1
是指向该实例中代表该内存的位置的指针/引用。
然后您实例化var person2 = person1
,因此person2
成为指向内存中相同位置的另一个指针。但是它们是两个不同/独立的指针。
第person1 = Person()
行更改了person1
指向的内存位置:类Person
的新实例。您尚未更新person2
指向的实例。