Ответ
По умолчанию — по сильной ссылке (strong reference). Механизм зависит от типа переменной и использования списка захвата (capture list).
-
Reference-типы (классы): Захватываются по сильной ссылке. Это может создать цикл сильных ссылок (retain cycle).
class MyClass { var value = 0 lazy var closure: () -> Void = { print(self.value) // Захват `self` по сильной ссылке! } } -
Value-типы (структуры, перечисления): По умолчанию также захватываются по ссылке на исходный экземпляр. Чтобы захватить копию значения на момент создания замыкания, используйте список захвата:
var number = 42 let closure = { [number] in // Захват КОПИИ значения `number` print(number) } number = 100 closure() // Выведет: 42 -
Управление ссылками для классов: Во избежание циклов используйте в списке захвата
weakилиunowned.let closure = { [weak self] in guard let self = self else { return } self.doSomething() // Безопасная работа с опциональной ссылкой }