Ответ
Основной механизм — Automatic Reference Counting (ARC). Он автоматически подсчитывает сильные ссылки на экземпляры классов и освобождает память, когда счетчик достигает нуля.
Типы ссылок в ARC:
strong(сильная, по умолчанию): Увеличивает счетчик ссылок. Объект живет, пока есть хотя бы одна сильная ссылка.weak(слабая): Не увеличивает счетчик. Автоматически становитсяnil, когда объект освобождается. Всегда объявляется как опциональная переменная (var).class Client { weak var delegate: ClientDelegate? // Предотвращает retain cycle }unowned(бесхозная): Аналогичнаweak, но не является опциональной. Предполагается, что ссылаемый объект имеет тот же или больший срок жизни. Обращение к освобожденномуunownedобъекту вызывает краш.class Customer { let id: String // Карта всегда существует, пока существует Customer unowned let loyaltyCard: LoyaltyCard }
Ключевые аспекты и практики:
- Retain Cycles (Циклы сильных ссылок): Главная проблема ARC. Возникает, когда два объекта держат друг друга сильными ссылками. Решение: Использовать
weakилиunownedдля одной из ссылок. - Замыкания как ссылочные типы: Замыкание захватывает и сильно ссылается на используемые в нем объекты.
networkService.fetchData { [weak self] result in // Используем weak self self?.handle(result) // Обращение через optional chaining } - Autorelease Pool: Позволяет отложить освобождение объектов, созданных в цикле или при интенсивной работе, чтобы снизить пиковое потребление памяти.
До ARC использовалось ручное управление памятью (Manual Retain-Release, MRR).