繁体   English   中英

Swift的内存管理

[英]Swift's memory management

关于Swift的内存管理,我有点困惑。 有人可以向我解释为什么kid1总是停留在同一个内存地址? 即使我做kid1 = kid2或初始化一个新对象?

示例游乐场

您的代码打印了kid1变量的内存位置,如果kid1变量赋值,则不会更改。

如果Kid是引用类型(类),那么您可以使用ObjectIdentifier来获取变量引用的类实例的唯一标识符:

var kid1 = Kid(name: "A")
var kid2 = Kid(name: "B")

print(ObjectIdentifier(kid1)) // ObjectIdentifier(0x0000000100b06220)
print(ObjectIdentifier(kid2)) // ObjectIdentifier(0x0000000100b06250)

kid1 = kid2
print(ObjectIdentifier(kid1)) // ObjectIdentifier(0x0000000100b06250)

对象标识符恰好是指向实例的地址,但这是一个未记录的实现细节。 如果你需要将对象引用转换为真实的指针,那么你可以做(​​比较如何在swift中将self转换为UnsafeMutablePointer <Void>类型

print(Unmanaged.passUnretained(kid1).toOpaque())

为什么kid1都指向相同的MemoryAddress

通常,类是引用类型。 这意味着,类的所有实例将共享一个数据副本。
即,它就像一个可变数据,如果您在任何一次类实例中更改数据,那么它将影响对其所有相关实例的更改。

它主要处理内存地址。

我想你已经宣布你的课程如下:

class Kid {
    var name: String?
    init(name:String) {
        self.name = name
    }
}

那么

  1. var kid1 = Kid(name: "A") :对于kid1实例,它将分配一些内存地址,比如说<Kid: 0x60400024b400>

  2. var kid2 = Kid(name: "B") :对于kid2实例,它会分配一些其他的内存地址,比如说<Kid: 0x60400024b760>

  3. 当你做kid1 =kid2kid1内存地址将被改为kid2内存地址。 因此, kid1kid2将指向相同的内存地址。

  4. kid1.name = "C" :现在如果更改kid1.name ,..它也会反映到kid2.name值,因为两者都指向相同的内存地址。

因此你得到:

kid1.name == "C"
kid2.name == "C" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM