【问题标题】:Why are ObjectIdentifiers sometime reused?为什么有时会重用 ObjectIdentifiers?
【发布时间】:2020-05-11 06:59:27
【问题描述】:

我运行的代码看起来像

final class Foo: Identifiable {}

let id1 = Foo().id
print("id1", id1.hashValue)

let id2 = Foo().id
print("id2", id2.hashValue)
print("id1 == id2", id1 == id2)

let foo1 = Foo()
let foo2 = Foo()
print("id3", foo1.id.hashValue)
print("id4", foo2.id.hashValue)

我意识到通常——并非总是——前两个 id 相同(相同的散列,相同的指针),后两个总是不同的,第二个和第三个散列值也经常——并不总是 - 保持不变。

例如,这很可能会打印出来

// id1, id2 and id3 are the same
id1 372028973742592862
id2 372028973742592862
id1 == id2 true
id3 372028973742592862
id4 -6512610764240591489

有时

// id1 and id2 are the same
id1 682965245911293614
id2 682965245911293614
id1 == id2 true
id3 -1068884789025324935
id4 6999154593386001644

而且很少

// all ids are different
id1 9219089083903263322
id2 6156776739104921767
id1 == id2 false
id3 -8383648492598359180
id4 483187449076408614

发生了什么?

【问题讨论】:

    标签: ios swift memory-management


    【解决方案1】:

    我的理解是ObjectIdentifier是基于对象的内存地址。前两个对象没有被保留,Swift 可以为新对象重用内存槽。然后这个新对象获得与前一个对象完全相同的标识符。

    最后两个对象被保留,所以没有内存复用,id总是不同的。

    我发现 Swift 允许 "unique identity" 仅在给定时刻是唯一的,而不是随着时间的推移是唯一的,这让我感到非常困惑。一旦这些 id 在对象被释放后仍然存在,这就是一个问题。

    【讨论】:

    • 有两种方法:序列(难以扩展,但连续)和随机化(易于扩展,但不连续)。这就是 UUID 如此受欢迎的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2013-10-08
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多