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 — локальная установка не требуется.
Все уроки этого курса
- Как работает defer
- Порядок выполнения нескольких блоков defer
- defer для освобождения ресурсов
- defer с ошибками и ранним возвратом