Почему идентификаторы объектов иногда используются повторно? - PullRequest
0 голосов
/ 25 января 2020

Я выполнял код, который выглядит как

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)

Я понял, что часто - не всегда - первые два идентификатора будут одинаковыми (тот же ha sh, тот же указатель), что последние два всегда будет отличаться, и что второе значение ha sh и третье также часто - не всегда - будут одинаковыми.

Например, это, скорее всего, напечатает

// 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

Что происходит?

1 Ответ

1 голос
/ 25 января 2020

Насколько я понимаю, ObjectIdentifier основан на адресе памяти объекта. Первые два объекта не сохраняются, Swift может повторно использовать слот памяти для нового объекта. Этот новый объект затем получает точно такой же идентификатор, что и предыдущий.

Последние два объекта сохраняются, поэтому повторное использование памяти отсутствует, и идентификаторы всегда разные.

Я нахожу это очень заблуждение, что Swift допускает, что «уникальная личность» будет уникальной только в данный момент, но не во времени. Это проблема, как только эти идентификаторы сохраняются после освобождения объектов.

...