Почему адрес памяти такой же, после наведения на новый объект? - PullRequest
0 голосов
/ 25 августа 2018

Я настроил следующее на детской площадке и ожидаю, что последние два адреса памяти будут одинаковыми.Я указываю person2 на person1, затем person1 переназначается новому человеку, поэтому person2 должен иметь тот же адрес памяти, что и персона 1.

Почему у него тот же адрес, что и при первомназначить это?

class Person {
  var name = ""
}

var person1 = Person()
print(Unmanaged.passUnretained(person1).toOpaque())
//0x0000600000043ea0

var person2 = person1

person1 = Person()
print(Unmanaged.passUnretained(person1).toOpaque())
//0x00006000000568f0
print(Unmanaged.passUnretained(person2).toOpaque())
//0x0000600000043ea0

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вот таблица, в которой отслеживаются объекты, на которые указывают person1 и person2 по мере выполнения кода:

// code                   | person1 points to: | person2 points to: 
// -----------------------+--------------------+--------------------
// start                  | 0xXXXXXXXXXXXXXXXX | 0xXXXXXXXXXXXXXXXX
var person1 = Person() // | 0x0000600000043ea0 | 0xXXXXXXXXXXXXXXXX
let person2 = person1  // | 0x0000600000043ea0 | 0x0000600000043ea0
person1 = Person()     // | 0x00006000000568f0 | 0x0000600000043ea0

X s представляют неинициализированную память, которая может иметь любое значение (из того, что было там ранее сохранено).

person1 и person2 - это переменные, которые хранятся в стеке, содержимое которых является адресами (ссылками на) Person объектов. Для ясности давайте назовем Person имена объектов:

  • Персона Объект X, в 0x0000600000043ea0
  • Персона Объект Y, в 0x00006000000568f0

Object graph showing reference type aliasing.

0 голосов
/ 25 августа 2018

Так работают ссылочные типы в Swift.

Когда вы создали person1, это экземпляр класса Person.person1 - это указатель / ссылка на место в памяти, которое представляет этот экземпляр.

Затем вы создаете экземпляр var person2 = person1, поэтому person2 становится другим указателем на то же место в памяти.Но это два разных / независимых указателя.

Строка person1 = Person() изменяет местоположение в памяти, на которое указывает person1: новый экземпляр класса Person.Вы не обновили экземпляр, на который person2 указывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...