Ответ
Объект немедленно освобождается системой автоматического подсчёта ссылок (ARC).
Процесс освобождения:
- Вызывается деинициализатор
deinit(если он определён) - Память, занимаемая объектом, возвращается системе
- Все weak-ссылки на объект становятся
nil
Пример:
class User {
let name: String
init(name: String) {
self.name = name
}
deinit {
print("Объект User с именем (name) удалён")
}
}
var user: User? = User(name: "Анна") // Сильная ссылка: 1
var weakRef = user // Это не weak-ссылка!
user = nil // Сильная ссылка: 0 → срабатывает deinit
// Вывод: "Объект User с именем Анна удалён"
Ключевые моменты:
- Только сильные ссылки влияют на счётчик. Weak/unowned ссылки не увеличивают счётчик.
- Циклические ссылки создают утечки памяти. Используйте
weakилиunownedдля их разрыва. - Структуры (struct) не используют ARC, так как являются типами-значениями.
Проверка в коде:
class Example {
deinit { print("Deinit called") }
}
var example: Example? = Example()
print(CFGetRetainCount(example)) // Примерно 2 (не используйте в production)
example = nil // "Deinit called"