В Swift capture lists определяют, как замыкание захватывает ссылки из окружающей области видимости. Они объявляются в квадратных скобках в начале замыкания, перед списком параметров.
{ [weak self, unowned delegate] in
self?.doSomething()
delegate.notify()
}
По умолчанию замыкания захватывают сильные ссылки. Это увеличивает счётчик ссылок захватываемого объекта, что может привести к retain cycles — ситуациям, когда два объекта держат сильные ссылки друг на друга и никогда не удаляются из памяти.
Optional, автоматически становится nil, если объект удалён — безопасно, но требует распаковки опционала[weak self], когда замыкание может пережить self, например в асинхронных колбэках или сетевых запросах[unowned self], когда ты уверен, что self переживёт замыкание, например в некоторых паттернах с делегатами[weak self] вместо [unowned self], когда сомневаешься — это более безопасный выборРаспространённый паттерн для безопасного использования self внутри замыкания с [weak self]:
{ [weak self] in
guard let self = self else { return }
self.updateUI()
}
Это гарантирует, что self всё ещё существует перед выполнением кода, защищая сразу от retain cycles и неожиданных крашей.
По умолчанию замыкания в Swift захватывают ссылки с сильной семантикой, что увеличивает счетчик ссылок захватываемых объектов и может потенциально создать циклические ссылки.
Новый — ещё не проверен сообществом
Вы