我是否需要在UIAlertController的动作完成处理程序中弱捕获自己

时间:2019-04-30 08:41:42

标签: ios swift closures weak-references retain-cycle

我已经读到,如果UIAlertController引用是UIAlertController,则不需要在weak动作完成处理程序中弱捕获self。原因是UIAlertController旨在在执行完成后释放所有内容,但前提是您对此保留较弱的引用。

Source here

这是一个假设的例子:

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的弱引用的有效方法吗?

在这种情况下,是否会强烈引用自我,是否会导致保持周期?

2 个答案:

答案 0 :(得分:0)

  

这是保持对UIAlertController的弱引用的有效方法吗?:

是的,是真的

在这种情况下,是否会强烈引用自我,是否会导致保持周期? 弱的自我会引用值,当基类被破坏时,它会释放内存。因此它不保留周期。

答案 1 :(得分:0)

在示例代码中,UIAlertController似乎不是视图控制器的变量。在这种情况下,您无需弱化操作的处理程序中的self(顺便说一句,处理程序的参数应为UIAlertAction->Void)。

当将调用present的视图控制器保留UIAlertController时,它在处理程序中需要[weak self]。在其他情况下,则不需要“周”。

此外,您提供的链接对其进行了清晰说明。