self 是否应该在 UIAlertAction 的处理程序中被捕获为强?
Should self be captured as strong in a UIAlertAction's handler?
在编写 UIAlertAction
的 handler
闭包时,对 self
的引用应该是强引用(默认)、weak
还是 unowned
?
有与此主题相关的帖子 (1, 2, 3, ),但老实说,我看不出它们对这种情况有何帮助。
让我们关注这个典型的代码:
func tappedQuitButton() {
let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)
let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(quitAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)
}
这是 UIViewController
子类中的函数,因此 self
是呈现警报的视图控制器。
Use a weak reference to avoid reference cycles whenever it is possible for that reference to have “no value” at some point in its life. If the reference will always have a value, use an unowned reference instead.
我可能是瞎子,但我仍然看不出这对回答我关于 UIAlertAction
的问题有何帮助。
在上面的代码中,self
是否有可能在其生命周期的某个时刻 为 nil ?是的。所以我应该将 self
标记为 weak
.
但话又说回来,我想不出在调用闭包时 self
将为 nil 的合理场景。因此,就闭包而言,self
将始终具有一个值 。所以我应该将 self
标记为 unowned
。
所以,再一次,应该如何 self
在 UIAlertAction 的处理程序中捕获?
要问自己的关键问题是您的警报对象是否是 "owned" 自己。在这种情况下,它不是(因为您在函数体中声明了 let alert = ...
)。因此您不需要将其创建为弱引用或无主引用。
如果 alert 是 self 的 属性,那么它将是 self 的 "owned",这就是您想要在闭包中创建对 self 的弱引用的时候 "owned"通过警报。
在编写 UIAlertAction
的 handler
闭包时,对 self
的引用应该是强引用(默认)、weak
还是 unowned
?
有与此主题相关的帖子 (1, 2, 3,
让我们关注这个典型的代码:
func tappedQuitButton() {
let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)
let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(quitAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)
}
这是 UIViewController
子类中的函数,因此 self
是呈现警报的视图控制器。
Use a weak reference to avoid reference cycles whenever it is possible for that reference to have “no value” at some point in its life. If the reference will always have a value, use an unowned reference instead.
我可能是瞎子,但我仍然看不出这对回答我关于 UIAlertAction
的问题有何帮助。
在上面的代码中,self
是否有可能在其生命周期的某个时刻 为 nil ?是的。所以我应该将 self
标记为 weak
.
但话又说回来,我想不出在调用闭包时 self
将为 nil 的合理场景。因此,就闭包而言,self
将始终具有一个值 。所以我应该将 self
标记为 unowned
。
所以,再一次,应该如何 self
在 UIAlertAction 的处理程序中捕获?
要问自己的关键问题是您的警报对象是否是 "owned" 自己。在这种情况下,它不是(因为您在函数体中声明了 let alert = ...
)。因此您不需要将其创建为弱引用或无主引用。
如果 alert 是 self 的 属性,那么它将是 self 的 "owned",这就是您想要在闭包中创建对 self 的弱引用的时候 "owned"通过警报。