0Pricing
Swift Academy · Урок

Деинциализаторы и жизненный цикл памяти

Используйте deinit для освобождения ресурсов перед удалением объекта из памяти.

«Деинциализаторы и жизненный цикл памяти» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Классы Swift могут определять `deinit`, который выполняется непосредственно перед освобождением экземпляра. Понимание полного жизненного цикла объекта — от `init` через использование до `deinit` — важно для управления ресурсами.

Что такое deinit

```swift class FileHandle { let path: String init(path: String) { self.path = path; print("Opened \(path)") } deinit { print("Closed \(path)") } } do { let f = FileHandle(path: "/tmp/log.txt") } // deinit called here when f goes out of scope ```

Правила синтаксиса deinit

• Только классы — у структур и перечислений нет `deinit` • Без параметров и возвращаемого значения • Без скобок: `deinit { }`, а не `deinit() { }` • Вызывается автоматически ARC — никогда не вызывайте его самостоятельно • `deinit` суперкласса автоматически вызывается после `deinit` подкласса

Сценарии очистки

Распространённые варианты использования `deinit`: • Закрытие сетевых соединений • Удаление наблюдателей уведомлений: `NotificationCenter.default.removeObserver(self)` • Аннулирование таймеров • Закрытие файловых дескрипторов или соединений с базой данных

Счётчик удержания и жизненный цикл

ARC отслеживает количество сильных ссылок, указывающих на объект: ```swift var a: Dog? = Dog() // retain count = 1 var b = a // retain count = 2 a = nil // retain count = 1 b = nil // retain count = 0 → deinit called ```

Цепочка deinit подклассов

```swift class Base { deinit { print("Base deinit") } } class Child: Base { deinit { print("Child deinit") } // super.deinit called automatically after } var c: Child? = Child() c = nil // prints: Child deinit, then Base deinit ```

Слабые ссылки предотвращают удержание

```swift class Owner { var pet: Dog? deinit { print("Owner gone") } } class Dog { weak var owner: Owner? // weak = no strong retain deinit { print("Dog gone") } } ``` Когда `owner` получает значение nil, `Owner` может быть освобождён, даже если `Dog` хранит ссылку на него.

Циклы удержания препятствуют вызову deinit

```swift class A { var b: B? } class B { var a: A? } var a: A? = A() var b: B? = B() a?.b = b b?.a = a a = nil b = nil // deinit never called — retain cycle! ```

Шаблон аннулирования таймера

```swift class PollingService { var timer: Timer? func start() { timer = Timer.scheduledTimer(...) } deinit { timer?.invalidate() timer = nil print("Timer stopped") } } ```

Поиск утечек с помощью Instruments

Если `deinit` никогда не вызывается, вероятно, у вас есть цикл удержания. Используйте в Xcode Instruments шаблон Leaks, чтобы обнаружить объекты, которые были выделены, но никогда не освобождались.

Быстрая проверка

Какие типы могут определять `deinit`?

Повторение

Основные выводы: • `deinit { }` — освобождает ресурсы перед удалением объекта • Только классы; `deinit` суперкласса автоматически вызывается после `deinit` подкласса • ARC определяет момент вызова `deinit` — когда счётчик удержания уменьшается до 0 • Циклы удержания препятствуют вызову `deinit` — разрывайте их с помощью `weak`/`unowned` • Используйте Instruments Leaks для поиска объектов, у которых `deinit` никогда не вызывается Курс завершён! Далее: шаблоны перечислений и конечные автоматы.

Часто задаваемые вопросы

Урок «Деинциализаторы и жизненный цикл памяти» бесплатный?

Да — полный текст урока «Деинциализаторы и жизненный цикл памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Деинциализаторы и жизненный цикл памяти»?

Используйте deinit для освобождения ресурсов перед удалением объекта из памяти. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Деинциализаторы и жизненный цикл памяти»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Наследование классов и ключевое слово super
  2. override, final и запрет наследования
  3. Приведение типов: is, as?, as! и as
  4. Деинциализаторы и жизненный цикл памяти
← Назад к Swift Academy