Ответ
В ARC объект уничтожается (деинициализируется) в момент, когда количество сильных (strong) ссылок на него становится равным нулю.
Основные сценарии:
- Удаление последней сильной ссылки: Присвоение
nilпеременной или свойству, которое было последней сильной ссылкой на объект. - Выход из области видимости: Локальная переменная, удерживающая объект, уничтожается при завершении выполнения области (например, функции).
- Обнуление weak-ссылки: Если объект удерживался только через
weak-ссылку, он уничтожается немедленно. Самаweak-ссылка автоматически становитсяnil.
Пример:
class MyClass {
deinit { print("Объект уничтожен") }
}
func testScope() {
let obj = MyClass() // retain count = 1
} // Выход из области видимости -> release -> deinit
var strongRef: MyClass? = MyClass() // retain count = 1
weak var weakRef = strongRef // retain count не увеличивается
strongRef = nil // retain count становится 0 -> deinit. weakRef автоматически становится nil
Почему это важно: Понимание момента деинициализации критично для предотвращения утечек памяти и корректного освобождения ресурсов (закрытия файлов, остановки таймеров) в методе deinit.
Ответ 18+ 🔞
А, ну ты смотри, какой умный подкатил! Решил разобраться, когда же эта штука, объект, наконец-то, блядь, сдохнет в ARC? Ну слушай сюда, сейчас разжую.
Вот представь: объект живёт, пока на него кто-то смотрит. Не в смысле подглядывает в замочную скважину, а в смысле держит за жопу сильной ссылкой. Это как последний кусок пиццы на тарелке — пока хоть один голодный взгляд на него устремлён, его не выкинут. Но стоит всем отвернуться — тут же летит в мусорку, в деинициализатор, то есть.
Так когда же конкретно наступает этот пиздец, простите, момент истины?
- Последнюю сильную ссылку прихлопнули. Это классика! Была переменная, держала объект. Ты ей
nilприсвоил — и всё, пиши пропало. Никто больше не держит — объект пошёл нахуй, в деинициализацию. - Область видимости закончилась. Зашёл в функцию, создал там локальную переменную — объект живёт. Вышел из функции — переменная испарилась, ссылка умерла. Если она была последней — ну ты понял, в рот меня чих-пых, объекту конец.
- Слабую ссылку (
weak) обнулили. Вот это, блядь, интересно! Если на объект смотрели только слабыми, хилыми взглядами (weak), а сильных-то и не было — так он даже не родится, что ли? Нет, родится, но его сразу же, сука, и прибьют. Ну или если все сильные ссылки отвалились, а остались толькоweak— они моментально становятсяnil, а объект — в утиль.
Смотри, как это выглядит в коде, тут без мата, всё чинно:
class MyClass {
deinit { print("Объект уничтожен") } // Вот этот крик души перед смертью
}
func testScope() {
let obj = MyClass() // Создали, счётчик ссылок = 1
} // Вышли из функции — бац, ссылка `obj` умерла, счётчик стал 0 -> вызывается deinit
var strongRef: MyClass? = MyClass() // Снова создали (retain count = 1)
weak var weakRef = strongRef // Слабая ссылка, счётчик НЕ увеличивается!
strongRef = nil // Последнюю сильную убили, счётчик = 0 -> deinit! И weakRef тут же автоматом становится nil.
А нахуй это вообще важно-то? Да затем, чувак, что если ты не понимаешь, когда твой объект помрёт, ты или память потечёшь, как решето (объекты вечно жить будут), или в deinit не успеешь сделать что надо — файл не закроешь, сетевой запрос не отменишь, таймер не остановишь. Короче, пиздец, а не работа. Так что вникай, это основа, блядь!