swift - 为什么指向new Object后内存地址是一样的?

标签 swift class reference-type

我在 Playground 上设置了以下内容,并期望最后两个内存地址相同。我将 person2 指向 person1,然后将 person1 重新分配给新的 Person,因此 person2 应该具有与以下相同的内存地址人物1。

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

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

最佳答案

下面是一个表格,随着代码的进行,跟踪 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 对象命名:

  • Person 对象 X,位于 0x0000600000043ea0
  • Person 对象 Y,位于 0x00006000000568f0

Object graph showing reference type aliasing.

关于swift - 为什么指向new Object后内存地址是一样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52012733/

相关文章:

swift - 编辑 - 我如何添加当答案错误时它会在正确答案中变成红色和绿色? swift 4.2

ios - 在 TableViewControllers 和 ViewControllers/Swift 之间切换数据

c++ - 从子类访问私有(private)结构

c# - c#中的int是什么?

swift - 一次将多个引用类型值设置为 nil

arrays - 如何在 Swift 的 boolean 数组中找到多个 True 语句

ios - 当我将许多大图像合并到一个 UIImage 中时,UIImage 为空白

java - 调用类实例时线程访问无效

c++ - 覆盖运算符 = 以便我们可以使用 = 复制类实例而不会出现浅拷贝问题

c# - 将类型引用类型设置为 null 不会影响复制的类型吗?