Циклы сильных ссылок: Замыкания захватывают переменные из окружающего контекста. Если замыкание и захваченный объект имеют сильные ссылки друг на друга, возникает цикл, предотвращающий освобождение памяти. Решается с помощью списков захвата (capture lists
).
Списки захвата (capture lists
): Определяют правила захвата переменных.
weak
: Ссылается на объект слабо. Объект может быть nil
.unowned
: Ссылается на объект без владения, предполагая, что объект не станет nil
до выполнения замыкания. Опасен, если предположение неверно.unowned(unsafe)
: Аналогично unowned
, но без проверок времени выполнения. Использовать с крайней осторожностью.swift
Изменяемость захваченных переменных: По умолчанию захваченные классы и их свойства изменяемы, а структуры и перечисления - нет. Чтобы изменить захваченную структуру/перечисление внутри замыкания, необходимо помечать замыкание как @escaping
и использовать inout
или создавать копию.
@escaping
атрибут: Указывает, что замыкание будет выполнено позже, не сразу после вызова функции, которая его принимает. Это означает, что замыкание "убегает" из области видимости функции. Требуется для асинхронных операций, колбэков и т.д. З
Циклы сильных ссылок: Замыкания захватывают переменные из окружающего контекста. Если замыкание и захваченный объект имеют сильные ссылки друг на друга, возникает цикл, предотвращающий освобождение памяти. Решается с помощью списков захвата (capture lists
).
Списки захвата (capture lists
): Определяют правила захвата переменных.
weak
: Ссылается на объект слабо. Объект может быть nil
.unowned
: Ссылается на объект без владения, предполагая, что объект не станет nil
до выполнения замыкания. Опасен, если предположение неверно.unowned(unsafe)
: Аналогично unowned
, но без проверок времени выполнения. Использовать с крайней осторожностью.swift
Изменяемость захваченных переменных: По умолчанию захваченные классы и их свойства изменяемы, а структуры и перечисления - нет. Чтобы изменить захваченную структуру/перечисление внутри замыкания, необходимо помечать замыкание как @escaping
и использовать inout
или создавать копию.
@escaping
атрибут: Указывает, что замыкание будет выполнено позже, не сразу после вызова функции, которая его принимает. Это означает, что замыкание "убегает" из области видимости функции. Требуется для асинхронных операций, колбэков и т.д. З
Register or sign in to get access to full answers for all questions from the question bank.