【发布时间】:2016-11-06 05:01:47
【问题描述】:
【问题讨论】:
标签: swift memory memory-management swift3
【问题讨论】:
标签: swift memory memory-management swift3
您的代码打印出kid1 变量的内存位置,
如果您为变量分配新值,这不会改变。
如果Kid 是引用类型(类),那么您可以使用
ObjectIdentifier 获取类 instance 的唯一标识符
变量引用:
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)
对象标识符恰好是指向的地址 例如,但这是一个未记录的实现细节。 如果您需要将对象引用转换为真正的指针 那么你可以做(比较How to cast self to UnsafeMutablePointer<Void> type in swift)
print(Unmanaged.passUnretained(kid1).toOpaque())
【讨论】:
为什么kid1 每次都指向同一个MemoryAddress?
一般来说,类是一种引用类型。这意味着,一个类的所有实例都将共享一个数据副本。
即,它就像一个可变数据,如果您在类的任何一次实例中更改数据,那么它将影响对该类的所有依赖实例的更改。
主要处理内存地址。
我想你已经像下面这样声明了你的类:
class Kid {
var name: String?
init(name:String) {
self.name = name
}
}
那么对于
var kid1 = Kid(name: "A"):对于kid1 实例,它将分配一些内存地址,例如<Kid: 0x60400024b400>
var kid2 = Kid(name: "B"):对于kid2 实例,它将分配一些其他内存地址,例如<Kid: 0x60400024b760>
当您执行kid1 =kid2 时:kid1 内存地址将更改为kid2 内存地址。所以,kid1 和 kid2 将指向同一个内存地址。
kid1.name = "C":现在如果更改kid1.name,..它也会反映到kid2.name值,因为两者都指向相同的内存地址。
因此你得到:
kid1.name == "C"
kid2.name == "C"
【讨论】:
Swift 支持 2 个类别(值类型、引用类型)。对于这些类型,我们可以拥有 3 种不同的行为 - 按引用复制、按值复制和写时复制。在您的情况下,类使用按引用复制,这意味着两个实例都指向相同的地址 - 共享一个数据副本。更多细节在我关于快速内存管理和性能的帖子中进行了描述,我深入到内存中的二进制值。我希望它有帮助: Swift Memory Management and Performance
【讨论】: