我正在运行看起来像这样的代码
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
发生了什么?
我的理解是,ObjectIdentifier
基于对象的内存地址。前两个对象未保留,Swift可以将内存插槽重新用于新对象。然后,这个新对象将获得与上一个完全相同的标识符。
保留了最后两个对象,因此没有内存重用,并且ID始终不同。
我发现非常令人困惑的是,Swift仅允许"unique identity"在给定的时刻是唯一的,而不是随着时间的推移而唯一的。一旦释放对象后这些ID仍然存在,这就是一个问题。