为了在UIBarButtonItem
的参数中使用闭包,我正在使用子类:
class ActionBarButtonItem: UIBarButtonItem {
private var actionHandler: (() -> Void)?
convenience init(title: String?, style: UIBarButtonItemStyle, actionHandler: (() -> Void)?) {
self.init(title: title, style: style, target: nil, action: #selector(barButtonItemPressed))
self.target = self
self.actionHandler = actionHandler
}
convenience init(image: UIImage?, style: UIBarButtonItemStyle, actionHandler: (() -> Void)?) {
self.init(image: image, style: style, target: nil, action: #selector(barButtonItemPressed))
self.target = self
self.actionHandler = actionHandler
}
@objc func barButtonItemPressed(sender: UIBarButtonItem) {
actionHandler?()
}
}
但现在我需要弱[weak self]
:
self.add(barButton: .menu, position: .left) { [weak self] in
guard let strongSelf = self else {return}
strongSelf.openMenu()
}
有没有办法仍然使用闭包作为选择器但不保存闭包以避免在任何地方使用弱自我而你可能会在某处忘记它?
答案 0 :(得分:1)
总之,没有。
如果你以后再打电话,你必须保存关闭。如果您正在保存闭包,并且该闭包引用ReadTimeoutHandler
,则应将.onChannelInit(channel ->
channel.pipeline()
.addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout())))
作为捕获列表的一部分以避免保留周期。这就是捕获列表的用途,并且是这种情况的正确编码模式。
每当你在闭包中提到self时,你需要停下来考虑保留周期。