【问题标题】:Swift's memory managementSwift 的内存管理
【发布时间】:2016-11-06 05:01:47
【问题描述】:

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

【问题讨论】:

    标签: swift memory memory-management swift3


    【解决方案1】:

    您的代码打印出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())
    

    【讨论】:

      【解决方案2】:

      为什么kid1 每次都指向同一个MemoryAddress

      一般来说,类是一种引用类型。这意味着,一个类的所有实例都将共享一个数据副本。
      即,它就像一个可变数据,如果您在类的任何一次实例中更改数据,那么它将影响对该类的所有依赖实例的更改。

      主要处理内存地址。

      我想你已经像下面这样声明了你的类:

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

      那么对于

      1. var kid1 = Kid(name: "A"):对于kid1 实例,它将分配一些内存地址,例如&lt;Kid: 0x60400024b400&gt;

      2. var kid2 = Kid(name: "B"):对于kid2 实例,它将分配一些其他内存地址,例如&lt;Kid: 0x60400024b760&gt;

      3. 当您执行kid1 =kid2 时:kid1 内存地址将更改为kid2 内存地址。所以,kid1kid2 将指向同一个内存地址。

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

      因此你得到:

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

      【讨论】:

        【解决方案3】:

        Swift 支持 2 个类别(值类型、引用类型)。对于这些类型,我们可以拥有 3 种不同的行为 - 按引用复制、按值复制和写时复制。在您的情况下,类使用按引用复制,这意味着两个实例都指向相同的地址 - 共享一个数据副本。更多细节在我关于快速内存管理和性能的帖子中进行了描述,我深入到内存中的二进制值。我希望它有帮助: Swift Memory Management and Performance

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
        • @kenny_k 我在答案中添加了更多上下文,希望现在没问题。
        猜你喜欢
        • 2015-03-13
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        相关资源
        最近更新 更多