使用闭合而不是选择器参数为UIBarButtonItem而不使用弱自我

时间:2017-09-15 12:08:11

标签: ios swift closures uibarbuttonitem retain-cycle

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

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

1 个答案:

答案 0 :(得分:1)

总之,没有。

如果你以后再打电话,你必须保存关闭。如果您正在保存闭包,并且该闭包引用ReadTimeoutHandler,则应将.onChannelInit(channel -> channel.pipeline() .addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout()))) 作为捕获列表的一部分以避免保留周期。这就是捕获列表的用途,并且是这种情况的正确编码模式。

每当你在闭包中提到self时,你需要停下来考虑保留周期。