gpt4 book ai didi

ios - 使用闭包而不是 UIBarButtonItem 的选择器参数但不使用弱 self

转载 作者:行者123 更新时间:2023-11-28 15:19:41 25 4
gpt4 key购买 nike

为了在 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()
}

有没有办法仍然使用闭包作为选择器但不保存闭包以避免在任何地方使用 weak self 而你可能会在某个地方忘记它?

最佳答案

一句话,没有。

如果稍后要调用它,则必须保存闭包。如果您正在保存一个闭包,并且该闭包引用 self,您应该将 self 作为捕获列表的一部分以避免保留循环。这就是捕获列表的用途,也是这种情况下的正确编码模式。

每当您在闭包中引用 self 时,您都需要停下来思考一下保留周期。

关于ios - 使用闭包而不是 UIBarButtonItem 的选择器参数但不使用弱 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46239226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com