TGViewer
Мобильная разработка Мобильная разработка @mobdevelop · 3.87K subscribers
Post #135 1.52K
🦅Swift: ссылочные типы и циклы сохранения, weak и unowned

Ответ на один из 10 технических вопросов недавнего собеседования по Swift и Objective C был очевиден, но нуждался в точном объяснении.

Вот этот вопрос:

«Какие ссылки на объект применяются в Swift для предотвращения цикла сохранения:

a) сильные; б) слабые; в) бесхозные?»

Оптимальный ответ: б) слабые.

Но почему?

Циклы сохранения
Если вкратце, для управления памятью в Swift используется автоматический подсчет ссылок.

Когда объект инстанцируется, в памяти сохраняется дополнительная информация о нем для автоматических операций сохранения и освобождения, таких как подсчет ссылок — в коде это retainCount, — чтобы сохранить объект со строгими ссылками на его дочерние объекты, пока он во избежание высвобождения памяти еще «помечен» строгой ссылкой как необходимый.

«А КАК НАСЧЕТ ЗНАЧЕНИЙ-ТИПОВ ВРОДЕ СТРУКТУР?»
В ОТЛИЧИЕ ОТ ССЫЛОЧНЫХ ТИПОВ, ОБЪЕКТОВ, КОТОРЫМИ С ПОМОЩЬЮ ЭТИХ RETAINCOUNT ОТСЛЕЖИВАЕТСЯ ЧИСЛО ССЫЛОК НА ОБЪЕКТ, ЗНАЧЕНИЯМ-ТИПАМ ТАКАЯ СТРАТЕГИЯ НЕ ТРЕБУЕТСЯ. КАЖДЫЙ ЭКЗЕМПЛЯР ЗНАЧЕНИЯ-ТИПА — ЭТО СОБСТВЕННАЯ, НЕЗАВИСИМАЯ ЧАСТЬ ДАННЫХ, И ОБЛАСТЬ ЕГО СУЩЕСТВОВАНИЯ ПРИВЯЗАНА КО ВНЕШНЕЙ ЕГО ОБЛАСТИ.
КОПИИ ЭТИХ ЗНАЧЕНИЙ СОЗДАЮТСЯ ИХ ПЕРЕДАЧЕЙ КАК АРГУМЕНТОВ ИЛИ СОХРАНЕНИЕМ В ДРУГИХ ПЕРЕМЕННЫХ. НАПРИМЕР, ПРИ ПЕРЕДАЧЕ В SWIFT В КАЧЕСТВЕ АРГУМЕНТА ФУНКЦИИ ЗНАЧЕНИЯ-ТИПА, ТАКОГО КАК СТРУКТУРА ИЛИ ПЕРЕЧИСЛЕНИЕ, СОЗДАЕТСЯ КОПИЯ ЭТОГО ЗНАЧЕНИЯ И ТАКИМ ОБРАЗОМ ВЫДЕЛЯЕТСЯ НОВЫЙ КУСОК ПАМЯТИ. ЭТО НАЗЫВАЕТСЯ СЕМАНТИКОЙ КОПИРОВАНИЯ.

Возьмем приложение с двумя классами:
class Manager: EmployeeDelegate {

let employee: Employee

init(employee: Employee) {
self.employee = employee
self.employee.delegate = self
}

func perform() {/* код */}
...
}

protocol EmployeeDelegate: AnyObject {
func perform()
}

class Employee {

public var delegate: EmployeeDelegate?

...
}

В Swift это типичный шаблон с классом, который «знает», когда выполнять операцию, но неизвестно какую. В этом случае шаблоном делегирования с protocol гарантируется, что руководитель Manager определяет операцию и дает указания работнику Employee, который в нужный момент их выполняет.

Сильные ссылки
Проблема в том, что в этом примере очень четко генерируется цикл сохранения. Почему? Когда создается экземпляр Manager, в него передается Employee, который сохраняется, и создается сильная ссылка, так что память от объекта Employee не освобождается, пока существует его Manager.

Чтобы определить операции JobDelegate, для Employee нужен делегат. Здесь в методе инициализатора в качестве делегата задан объект Manager, так что в Employee тоже имеется сильная ссылка на Manager и память от экземпляра Manager не освобождается, пока существует его Employee.

То есть они не дадут друг другу освободить память в течение неопределенного времени:

📌 Продолжение
  • ❤ 3
  • 👍 3
More from @mobdevelop
  1. Sep 22, 2026Rune: нативный Kubernetes-клиент для macOS Rune помогает быстрее диагностировать кластеры…
  2. Sep 15, 2026🎉 Swift 6.4 уже вышел — и релиз получился заметно шире обычного обновления языка. Главное…
  3. Aug 31, 2026ReactOS 0.4.16 вышла с крупным набором обновлений. Главные изменения: - появился новый гра…
  4. Aug 19, 2026✔️ Апдейт ChatGPT: изолированный контекст в Projects, тесты для проверки знаний и правки д…
  5. Jul 12, 2026Docker Desktop на Mac давно ругают за прожорливость. Apple выкатила свой вариант container…
  6. Jun 23, 2026Apple фактически сделала Docker Desktop необязательным на Mac. И полностью бесплатно. Речь…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →