【发布时间】:2019-10-15 23:56:23
【问题描述】:
我厌倦了在闭包中使用 [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)
}
这会创建一个保留周期吗?
【问题讨论】:
-
99% 的情况下,如果您使用内联闭包并且被调用的函数只是将传递的闭包保存在局部变量中(而不是将其存储在属性中),则不会有保留循环并且不需要
weak self -
@Paulw11 我什么时候需要在
createConfirmationPageItem()块中使用[weak vc]?我只是在想这可能会捕获 vc 并导致某种循环 -
所以我只是尝试了这个,结果我必须将 [weak vc] 放在
createConfirmationPageItem()块中,因为它捕获了对它的强引用。