Назад к вопросам
МТС
Разумные решения
Альфа-Банк
Avito
VK
ivi
Вкусно и точка
Одноклассники
VK знакомства
Junior — Middle
74
Чем отличаются ссылки типа Weak и Unowned в управлении памятью?
Компании, где спрашивали
Itexus
Winline
ITFB
KTS
Spider Group
bip.ru
Touch Instinct
БКС
Летуаль
Ответ от нейросети
sobes.tech AI
В Swift ссылки типа weak и unowned используются для предотвращения циклов сильных ссылок (retain cycles) при управлении памятью, но отличаются по поведению и применению.
-
Weak (слабая ссылка):
- Может быть
nil. - Объявляется как опциональный тип (
var delegate: SomeDelegate? weak). - Используется, когда ссылка может стать
nilв течение жизни объекта, например, делегаты. - Система автоматически обнуляет
weakссылку, когда объект, на который она ссылается, освобождается.
- Может быть
-
Unowned (безвладелец):
- Не может быть
nil(неопциональный тип). - Используется, когда ссылка гарантированно существует во время жизни объекта, например, родитель-сын.
- Если объект, на который ссылается
unowned, уже освобождён, попытка доступа приведёт к ошибке времени выполнения (crash).
- Не может быть
Пример:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Здесь tenant — unowned, так как квартира не может существовать без жильца.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Делегат — weak, так как может быть освобождён раньше.
Таким образом, weak подходит для ссылок, которые могут стать nil, а unowned — для ссылок, которые всегда должны быть валидными во время жизни объекта.