Понимание работы ARC на примере
👋 Сегодня хочу продемонстрировать вам, как работает Automatic Reference Counting (ARC), на практике.
🚘 Для начала давайте создадим простой класс Car с одним свойством brand:
class Car { let brand: String init(brand: String) { self.brand = brand print("\(brand) is being initialized") } deinit { print("\(brand) is being deinitialized") } }
✨ Внутри метода init есть функция print, которая выводит сообщение о создании объекта. Также есть метод deinit, который информирует о том, что объект освобожден из памяти.
2️⃣ Теперь создадим две переменные опционального типа. Поскольку они опциональные, их не нужно сразу инициализировать значением, они автоматически примут значение nil:
var car1: Car? var car2: Car?
🔷 Теперь инициализируем car1 новым значением:
car1 = Car(brand: "Kia")
🔶 В этот момент будет напечатано сообщение Kia is being initialized, и количество сильных ссылок на объект станет равным 1. Объект в памяти существует.
🔷 Далее, присвоим car2 значение car1:
car2 = car1
🔶 Объект все также существует в памяти, только теперь количество сильных ссылок на объект равняется 2.
🔷 Теперь инициализируем car2 значением nil:
car2 = nil
🔶 Объект по-прежнему существует в памяти, количество ссылок на него равно 1.
🔷 Наконец, инициализируем car1 значением nil:
car1 = nil
🔶 Количество ссылок становится равным 0, что означает, что ARC удаляет объект из памяти. После этого выполняется метод deinit, что приводит к выводу сообщения Kia is being deinitialized.
🔷 Обратите внимание, что порядок инициализации переменных не имеет значения. Главное — это количество сильных ссылок на объект.
♥️ Не забудьте поставить лайк, чтобы посты выходили быстрее!