Ответ
Garbage Collector (GC) — алгоритм автоматического управления памятью, который периодически находит и удаляет неиспользуемые объекты. В Swift/Objective-C для iOS/macOS GC не используется — вместо него применяется ARC (Automatic Reference Counting).
ARC vs Garbage Collector:
| Критерий | ARC (Swift/Objective-C) | Garbage Collector (Java/C#) |
|---|---|---|
| Принцип работы | Подсчёт ссылок во время компиляции/выполнения | Периодическое сканирование «живых» объектов |
| Время освобождения | Немедленно при достижении счётчиком нуля | Неопределённое (при срабатывании GC) |
| Производительность | Предсказуемая, без пауз | Возможны stop-the-world паузы |
| Циклические ссылки | Требуют weak/unowned |
Автоматически обнаруживаются |
Пример ARC в Swift:
class User {
let name: String
var friend: User? // Сильная ссылка → возможен retain cycle
init(name: String) { self.name = name }
deinit { print("(name) удалён из памяти") }
}
// Создаём циклическую ссылку
var alice: User? = User(name: "Alice")
var bob: User? = User(name: "Bob")
alice?.friend = bob // Alice → Bob
bob?.friend = alice // Bob → Alice (цикл!)
alice = nil // Память НЕ освобождается!
bob = nil // Оба объекта всё ещё в памяти
Решение с weak reference:
class User {
let name: String
weak var friend: User? // ← Слабая ссылка разрывает цикл
init(name: String) { self.name = name }
}
// Теперь при alice = nil и bob = nil память корректно освобождается
Ключевые механизмы Swift:
- Strong — обычная ссылка (увеличивает счётчик)
- Weak — не удерживает объект (автоматически становится nil)
- Unowned — как weak, но предполагает, что объект существует (краш при обращении к освобождённому)
- Autorelease pools — для Objective-C совместимости, отложенное освобождение