Память
October 16

Понимание работы 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.

🔷 Обратите внимание, что порядок инициализации переменных не имеет значения. Главное — это количество сильных ссылок на объект.

♥️ Не забудьте поставить лайк, чтобы посты выходили быстрее!

@iosdiving