Ответ
За отложенное освобождение памяти в 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.