Я устал использовать захват [weak self]
в замыканиях, поэтому я хотел бы передать self и вернуть его в замыкании следующим образом:
alertManager.askToConfirm(from: self) { vc, confirmed in
if confirmed {
vc.model.confirm()
} else {
vc.model.reject()
}
}
внутри AlertManager
мой код будет таким:
func askToConfirm<T>(from vc: T, completion: @escaping (T) -> ()) {
let invitation = pageItemFactory.createConfirmationPageItem() { [weak self] accepted in
self?.dismissAlert()
completion(vc, accepted)
}
present(invitation)
}
Создаст ли это цикл удержания?
@Paulw11Paulw11 когда мне может понадобиться использовать [weak vc] в блоке createConfirmationPageItem()
? Я просто подумал, что может захватить vc и вызвать какой-то цикл
Итак, я только что попробовал это, и оказалось, что мне нужно поместить [weak vc] в блок createConfirmationPageItem()
, так как он содержит сильную ссылку на него.
Нет, насколько я вижу, это не приведет к циклу удержания.
Например, этот буду приводит к циклу сохранения. Когда myFunction
выполняется, экземпляр Foo
будет содержать сильную ссылку на блок completion
. В свою очередь, блок completion
содержит сильную ссылку на экземпляр Foo
. Это будет цикл сохранения, и в этом случае вам нужно добавить список захвата.
class Foo<T> {
var completion: (T) -> ()
func myFunction(_ vc: T, completion: @escaping (T) -> ()) {
self.completion = completion // This will create a retain cycle
completion(vc)
}
func doSomething() {
myFunction(self) { vc in
print(vc)
}
}
}
Хм, я видел, как некоторые фреймворки возвращают vc без необходимости добавлять [weak self]. Как они это делают? Пример в addPlaybackStartedObserver
в этой статье: swiftbysundell.com/posts/observers-in-swift-part-2
Это зависит от контекста. Даже если vc
сохраняется, это не означает, что это приведет к циклу сохранения. Ваш пример не приведет к циклу сохранения, если только vc
не содержит строгой ссылки на само закрытие. (Я обновил свой ответ, чтобы он был более ясным и правильным.)
Моя функция с закрытием фактически находится в другом классе. Self содержит сильную ссылку на этот класс, из которого он вызывается.
Я добавил пример. Можете ли вы опубликовать свой полный код? Это облегчит оценку того, создан ли цикл.
Нет, насколько я вижу, это не приведет к циклу удержания.
В 99% случаев, если вы используете встроенное закрытие, а вызываемая функция просто хранит переданное закрытие в локальной переменной (в отличие от сохранения его в свойстве), цикла сохранения не будет, и
weak self
не нужен.