0Pricing
Swift Academy · Урок

defer для освобождения ресурсов

Надёжно закрывайте файлы и освобождайте ресурсы.

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

Проблема очистки

Такие ресурсы, как файлы, блокировки или соединения, необходимо освобождать. Если на каком-либо пути выполнения забыть освободить ресурс, возникает утечка.

func work() {
    print("acquire resource")
    print("use resource")
    print("release resource")
}
work()

defer гарантирует освобождение

Размещение освобождения в defer гарантирует его выполнение независимо от способа выхода функции.

func work() {
    print("acquire resource")
    defer { print("release resource") }
    print("use resource")
}
work()

Моделирование дескриптора файла

Здесь простая структура моделирует открытие и закрытие. defer гарантирует, что close будет вызван всегда.

struct File {
    let name: String
    func close() { print("closed", name) }
}
func readFile() {
    let f = File(name: "data.txt")
    defer { f.close() }
    print("reading", f.name)
}
readFile()

Захват и освобождение блокировки

Смоделируйте блокировку: захватите её, а затем отложите освобождение, чтобы критическая секция всегда разблокировалась.

func critical() {
    print("lock acquired")
    defer { print("lock released") }
    print("critical section work")
}
critical()

Очистка рядом с настройкой

Размещение очистки сразу после настройки делает их связь очевидной и помогает не забыть об очистке.

func session() {
    print("connect")
    defer { print("disconnect") }
    print("send request")
    print("receive response")
}
session()

Несколько ресурсов

При работе с несколькими ресурсами объявляйте очистку каждого сразу после его настройки; порядок LIFO закрывает их правильно.

func transaction() {
    print("open connection")
    defer { print("close connection") }
    print("begin transaction")
    defer { print("commit transaction") }
    print("run query")
}
transaction()

Сброс counter

defer может восстановить state, например сбросить флаг при завершении области видимости.

func tracked() {
    var active = true
    defer { active = false; print("active reset to", active) }
    print("active is", active)
}
tracked()

Избежание дублирования

Без defer пришлось бы повторять очистку на каждом пути выхода. defer позволяет записать её один раз.

func validate(_ ok: Bool) {
    print("start")
    defer { print("cleanup done once") }
    if !ok {
        print("invalid")
        return
    }
    print("valid")
}
validate(false)

Очистка с вычисляемым значением

defer может записать в журнал окончательное измерение, например количество обработанных элементов.

func batch() {
    var processed = 0
    defer { print("processed", processed, "items") }
    for _ in 1...3 { processed += 1 }
}
batch()

Восстановление временного состояния

Используйте defer, чтобы надёжно временно изменить настройку, а затем восстановить её.

func withVerbose() {
    var verbose = false
    verbose = true
    defer { verbose = false; print("verbose restored:", verbose) }
    print("verbose during work:", verbose)
}
withVerbose()

Рекомендуемый подход

Всегда регистрируйте освобождение с помощью defer на следующей строке после получения ресурса, который необходимо освободить.

func handle() {
    print("acquire")
    defer { print("release") }
    print("process")
}
handle()

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

Проверьте использование defer для очистки.

Итоги

Регистрируйте освобождение ресурса с помощью defer сразу после его получения. Очистка гарантированно выполняется на каждом пути выхода, остаётся рядом с настройкой и не дублируется в разных путях возврата.

func work() {
    print("acquire")
    defer { print("release") }
    print("use")
}
work()

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

Урок «defer для освобождения ресурсов» бесплатный?

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

Чему я научусь в уроке «defer для освобождения ресурсов»?

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

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

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

Сколько времени занимает урок «defer для освобождения ресурсов»?

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

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

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

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

  1. Как работает defer
  2. Порядок выполнения нескольких блоков defer
  3. defer для освобождения ресурсов
  4. defer с ошибками и ранним возвратом
← Назад к Swift Academy