Ответ
Ключевое слово unowned безопасно использовать вместо weak только тогда, когда вы можете гарантировать, что захваченный объект переживёт (или будет существовать ровно столько же, сколько) замыкание или объект, который его хранит. В отличие от weak, unowned не делает ссылку опциональной и не обнуляется, что при обращении к освобождённой памяти вызовет краш.
Правило применения: Используйте unowned, когда время жизни захватываемого объекта и его "владельца" (например, замыкания) строго связано и вы уверены в порядке их деинициализации.
Классический безопасный пример — устранение цикла сильных ссылок между родителем и ребёнком:
class Parent {
var child: Child
init() {
child = Child(parent: self)
}
deinit { print("Parent deinit") }
}
class Child {
// Родитель гарантированно существует дольше ребёнка
unowned let parent: Parent
init(parent: Parent) {
self.parent = parent
}
deinit { print("Child deinit") }
}
Когда использовать unowned:
- В замыканиях, время выполнения которых строго ограничено временем жизни захваченного объекта (например, анимация, которая точно завершится до удаления вью).
- В связях типа "родитель-ребёнок", где родитель владеет ребёнком.
Когда всегда использовать weak:
- При асинхронных операциях (сетевые запросы, таймеры), где объект может быть деинициализирован до вызова замыкания.
- В протоколах делегатов.
- В любой ситуации, где нет 100% уверенности в порядке освобождения памяти.
Ответ 18+ 🔞
А, ну это про наши любимые unowned и weak, да? Сидишь такой, пишешь код, всё летает, а потом — бац! — краш, и приложение твоё, как та Муму, на дно пошло. Пиздец, а не разработка.
Смотри, суть-то проще пареной репы, если не выёбываться. unowned — это как взять в долг у соседа-алкаша, который клянётся, что завтра отдаст. Ты уверен на все сто, что он не сдохнет ночью и не сбежит? Если да — бери смело. Если нет — готовься к тому, что придётся его искать по всему району, а он уже в говне лежит. В терминах кода — это краш, ёпта.
А weak — это взять в долг, но сразу мысленно списать эти деньги в убыток. Вернёт — хорошо, не вернёт — да похуй, жив будешь. Ссылка сама станет nil, и твоё приложение не накроется медным тазом.
Вот смотри, классическая история про родителя и ребёнка. Родитель — он же не сдохнет раньше своего же дитяти, это ж противоестественно, блядь. Ну, в нормальном мире. Поэтому тут unowned — самое то.
class Parent {
var child: Child
init() {
child = Child(parent: self) // Дите рождается, сразу знает, кто его папаня
}
deinit { print("Папаша деинициализировался — пошёл пить") }
}
class Child {
// Папа гарантированно будет жить дольше. 100%. Или это уже не папа, а пидарас.
unowned let parent: Parent
init(parent: Parent) {
self.parent = parent
}
deinit { print("Дитё деинициализировалось — пошло в школу") }
}
Видишь? Ребёнок хранит ссылку на родителя, но unowned. Цикла сильных ссылок нет, память освободится красиво. Это как в той истории: родитель создал ребёнка, ребёнок знает родителя, но не держит его за шкирку, когда тому на работу надо.
Так когда же unowned впиндюрить?
- Когда у тебя, например, анимация запустилась на вьюхе. Ты точно знаешь, что к моменту завершения анимации вьюха ещё будет жива. Она же на экране, куда она денется? Вот тут можно.
- Всякие связи «хозяин-слуга», где слуга без хозяина — просто кусок говна. Как в примере выше.
А когда обязательно слать unowned нахуй и ставить weak?
- Всё, что асинхронное, блядь! Сетевой запрос полетел, таймер тикает, операция в фоне. Пока этот долбоёб-запрос идёт, пользователь мог уже нахуй твой экран закрыть. И если ты использовал
unowned, то при попытке в колбэке обновить несуществующий лейбл — получишь краш. А сweak— просто проверишьif let, увидишьnilи скажешь: «Ну и похуй». - Делегаты. Это святое. Всегда
weak. Потому что объект А держит объект Б, а объект Б через делегат держит объект А. Классический цикл.weakего рвёт, как гнилую нитку. - В любой ситуации, где у тебя в голове мелькает мысль: «А вдруг?..». Если есть хоть тень сомнения — ставь
weak, не будь мудаком, как тот Герасим. Лучшеnil, чем краш.
Запомни: unowned — для максималистов, которые уверены в порядке жизни объектов, как в том, что Земля круглая. weak — для прагматиков, которые понимают, что в мире может случиться всякая хуйня. Выбирай, кто ты сегодня.