簡體   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