Вопрос проверяет понимание ARC, жизненного цикла объектов и причин утечек памяти в iOS-приложениях.
В iOS управление памятью основано на ARC — автоматическом подсчёте ссылок. Объект живёт, пока на него есть хотя бы одна сильная ссылка. Когда счётчик ссылок становится равен нулю, объект освобождается. Проблемы возникают из-за циклов сильных ссылок. Для их разрыва используют weak и unowned.
Управление памятью в iOS построено вокруг ARC, но важно понимать, что ARC — это не сборщик мусора, а компиляторный механизм.
Определение:
ARC (Automatic Reference Counting) — механизм, при котором компилятор автоматически вставляет операции увеличения и уменьшения счётчика ссылок.
ARC работает так:
при создании сильной ссылки счётчик увеличивается
при освобождении ссылки — уменьшается
при нуле объект деинициализируется
Swift предоставляет несколько видов ссылок:
strong — удерживает объект
weak — не удерживает, может стать nil
unowned — не удерживает, но не становится nil
Выбор типа ссылки напрямую влияет на жизненный цикл объекта.
Цикл возникает, когда:
объект A сильно ссылается на объект B
объект B сильно ссылается на объект A
ARC не может разорвать такой цикл автоматически.
Пример:
class A {
var b: B?
}
class B {
var a: A?
}
Без weak или unowned оба объекта утекут.
Типичные места проблем:
замыкания (self внутри closures)
делегаты без weak
таймеры и нотификации
Понимание ARC и типов ссылок критически важно для iOS-разработчика. Большинство утечек памяти связано не с ARC, а с неправильным использованием ссылок.