您的代码打印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)
对象标识符恰好是指向实例的地址,但这是一个未记录的实现细节。如果你需要将对象引用转换为真实指针,那么你可以做(比较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"