Как работает управление памятью в iOS (Swift)?

«Как работает управление памятью в iOS (Swift)?» — вопрос из категории Управление памятью, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основной механизм — 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 
    }

Ключевые аспекты и практики:

  1. Retain Cycles (Циклы сильных ссылок): Главная проблема ARC. Возникает, когда два объекта держат друг друга сильными ссылками. Решение: Использовать weak или unowned для одной из ссылок.
  2. Замыкания как ссылочные типы: Замыкание захватывает и сильно ссылается на используемые в нем объекты.
    networkService.fetchData { [weak self] result in // Используем weak self
        self?.handle(result) // Обращение через optional chaining
    }
  3. Autorelease Pool: Позволяет отложить освобождение объектов, созданных в цикле или при интенсивной работе, чтобы снизить пиковое потребление памяти.

До ARC использовалось ручное управление памятью (Manual Retain-Release, MRR).