为什么指向新对象后内存地址相同?
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 跟踪对象 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
s 代表未初始化的内存,它可以有任何值(来自之前存储的任何值)。
person1
和person2
是变量,存储在栈中,其内容是(引用)Person
对象的地址。为了清楚起见,我们给 Person
个对象命名:
- 人物对象
X
,位于 0x0000600000043ea0
- 人物对象
Y
,位于 0x00006000000568f0
我在操场上进行了以下设置,希望最后两个内存地址相同。我将 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 跟踪对象 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
s 代表未初始化的内存,它可以有任何值(来自之前存储的任何值)。
person1
和person2
是变量,存储在栈中,其内容是(引用)Person
对象的地址。为了清楚起见,我们给 Person
个对象命名:
- 人物对象
X
,位于 0x0000600000043ea0 - 人物对象
Y
,位于 0x00006000000568f0