Почему я не могу дать неизвестной константе начальное значение?

class Example {}
unowned let first = Example()

Это приводит к ошибке:

Attempted to read an unowned reference but object 0x60c000005f20 was already deallocated

Я пытаюсь понять, какое ключевое слово unowned делает.

2 ответа

Решение

С языка программирования Swift:

Как и слабая ссылка, неподдерживаемая ссылка не сохраняет сильного влияния на экземпляр, на который она ссылается.

Вы создаете новый экземпляр Exampleи присвойте его своей неизвестной константе first, Там нет ничего, что держит сильную ссылку на ваш Example экземпляр, так что он немедленно освобождается. Ваша неизвестная константа first теперь содержит ссылку на этот освобожденный объект, поэтому вы получаете сообщение об ошибке при попытке прочитать освобожденный объект.

unowned Ключевое слово используется для создания слабой ссылки на объект, где вы можете гарантировать, что время жизни ссылочного объекта будет таким же, как и у ссылающегося объекта. Это позволяет вам предотвращать циклы ссылки, избегая необходимости разворачивать необязательный (как было бы в случае с weak).

Документация Apple гласит:

Однако, в отличие от слабой ссылки, неподтвержденная ссылка используется, когда другой экземпляр имеет такое же или большее время жизни.

В вашем примере там, как толькоExample()"называется твой new собственность освобождена (newэто ужасное имя даже для свойства, даже если только для демонстрации:-).

Итак, что могло бы работать здесь:

class Example {}
let oneExample = Example() // properties are strong by default
unowned let theSameExample = oneExample
Другие вопросы по тегам