为什么有时重复使用ObjectIdentifier?

问题描述 投票:0回答:1

我正在运行看起来像这样的代码

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相同(相同的哈希,相同的指针),后两个ID总是不同,第二个哈希值和第三个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个回答
1
投票

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

保留了最后两个对象,因此没有内存重用,并且ID始终不同。

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

© www.soinside.com 2019 - 2024. All rights reserved.