我已经读到,如果UIAlertController
引用是UIAlertController
,则不需要在weak
动作完成处理程序中弱捕获self。原因是UIAlertController
旨在在执行完成后释放所有内容,但前提是您对此保留较弱的引用。
这是一个假设的例子:
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
// The action's completion handler captures the alert controller weakly, but self is not captured weakly
let action = UIAlertAction(title: "action title", style: .default, handler: { [weak alert] _ in
guard let alertController = alert else {
return
}
// The alert controller's action triggers a server call method owned by self
self.serverCall { result in
// We use the alertController inside the closure
print(alertController.actions)
DispatchQueue.main.async {
// Do stuff on the main thread with the result
}
}
})
alert.addAction(action)
这是保持对UIAlertController
的弱引用的有效方法吗?
在这种情况下,是否会强烈引用自我,是否会导致保持周期?
答案 0 :(得分:0)
这是保持对UIAlertController的弱引用的有效方法吗?:
是的,是真的
在这种情况下,是否会强烈引用自我,是否会导致保持周期? 弱的自我会引用值,当基类被破坏时,它会释放内存。因此它不保留周期。
答案 1 :(得分:0)
在示例代码中,UIAlertController
似乎不是视图控制器的变量。在这种情况下,您无需弱化操作的处理程序中的self
(顺便说一句,处理程序的参数应为UIAlertAction->Void
)。
当将调用present
的视图控制器保留UIAlertController
时,它在处理程序中需要[weak self]
。在其他情况下,则不需要“周”。
此外,您提供的链接对其进行了清晰说明。