Какой механизм в ARC отвечает за отложенное освобождение памяти?

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

Ответ

За отложенное освобождение памяти в Automatic Reference Counting (ARC) отвечает механизм autorelease pools (авторелизные пулы).

Как это работает: Объекты, отправленные в такой пул, получают сообщение autorelease. Пул временно удерживает их, предотвращая немедленное освобождение в конце текущего run loop итерации. Это позволяет избежать преждевременного удаления объектов, возвращаемых из методов (по старому соглашению Objective-C).

Практическое применение в Swift: Вручную создавать пулы нужно в основном при интенсивных циклах, создающих много временных объектов, особенно при работе с Objective-C API.

Пример:

// Без пула все 10,000 временных объектов могут накапливаться в памяти до конца итерации цикла.
for i in 0..<10_000 {
    autoreleasepool {
        let tempData = Data() // Objective-C класс NSData
        // Использование tempData...
    } // tempData будет освобождён здесь, в конце области видимости пула.
}

Ключевые моменты:

  • В главном потоке UIKit/AppKit автоматически создаёт autorelease pool на каждой итерации run loop.
  • В фоновых потоках, созданных через Thread или низкоуровневые API, а также в интенсивных циклах, необходимо создавать пулы вручную.
  • Чистый Swift-код (без взаимодействия с Objective-C) обычно не требует работы с autorelease pools.