Swift's memory management

2019-07-31 02:56发布

I'm a little confused regarding Swift's memory management. Can someone explain to me how come kid1 always stays at the same memory address? Even when I do kid1=kid2 or initialize a new object?

Sample Playground

2条回答
仙女界的扛把子
2楼-- · 2019-07-31 03:30

Your code prints the memory location of the kid1 variable, and that does not change if you assign a new value to the variable.

If Kid is a reference type (class) then you can use ObjectIdentifier to get a unique identifier for the class instance that the variable references:

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)

The object identifier happens to be the address of the pointed-to instance, but that is an undocumented implementation detail. If you need to convert an object reference to a real pointer then you can do (compare How to cast self to UnsafeMutablePointer<Void> type in swift)

print(Unmanaged.passUnretained(kid1).toOpaque())
查看更多
三岁会撩人
3楼-- · 2019-07-31 03:32

Why kid1 is pointing to the same MemoryAddress each time?

In general, a class is a reference type. Which means, all instances of a class will share a single copy of data.
I.e, it's like a mutable data, if you change a data at any once instance of class, then it will affect that change to all its dependent instances.

It mainly deals with the memory addresses.

I think you have declared your class like below:

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

then for

  1. var kid1 = Kid(name: "A"): For kid1 instance it will assign some memory address, say <Kid: 0x60400024b400>

  2. var kid2 = Kid(name: "B"): For kid2 instance it will assign some other memory address, say <Kid: 0x60400024b760>

  3. when you do kid1 =kid2: kid1 memory address will get changed to kid2 memory address. So, kid1 and kid2 will pointing to same memory address.

  4. kid1.name = "C": now if a change kid1.name,..it will reflect to kid2.name value also,because both are pointing to same memory address.

Therefore you get:

kid1.name == "C"
kid2.name == "C" 
查看更多
登录 后发表回答