宣告嵌套闭合中的弱点

时间:2019-01-22 13:38:48

标签: ios swift asynchronous

在接下来的0.5秒延迟期间,可能会释放tableViewManager。我想确保在嵌套闭包内部与textView交互时弱。我该怎么办?

const players = this.state.players.map(player => {
        return { ...player, updated: player.id === id };
});
this.setState({players: players});

编辑:请停止提供有关如何使自己变得虚弱的答案。这个问题不是在问“自我”。 textView。 teeeeexttt viiieeewww。

3 个答案:

答案 0 :(得分:1)

您可以使用常规语法:

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
    // textView is strong here
    asyncAfter(seconds: 0.5) { [weak textView] in
        // textView is weak here
        let value = textView?.tag // touched here
        self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }
}

已编辑:

尝试使用容器来避免该编译器错误:

class WeakLink<T: AnyObject> {
    weak var value: T?

    init(_ value: T) {
        self.value = value
    }
}

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
    let weakTextView = WeakLink(textView)
    asyncAfter(seconds: 0.5) {
        // textView is weak here
        let textView = weakTextView.value
        let value = textView?.tag // touched here
        self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }
}

答案 1 :(得分:0)

如果将[弱自我]放在顶部的闭包中,那么对于所有嵌套的闭包都是弱的...如果您不希望它在主闭包中是可选的,则考虑安全地将其展开。

tableViewManager.textViewDidBeginEditing = { [weak self] textView, indexPath in
  guard let self = self else { return } // optional...
  asyncAfter(seconds: 0.5) {
     let value = textView.tag // touched here
     self?.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }
}

更新:

我认为,如果将tableViewManager释放,闭包将永远不会被调用...对吗?因此无需担心“ textView”是可选的。这是一个闭包参数...因此您只能在闭包声明中进行设置。

tableViewManager引用一经使用,ARC就会自动删除闭包。

答案 2 :(得分:0)

这是不可能的。现在已将其识别为a bug