在接下来的0.5秒延迟期间,可能会释放tableViewManager。我想确保在嵌套闭包内部与textView交互时弱。我该怎么办?
const players = this.state.players.map(player => {
return { ...player, updated: player.id === id };
});
this.setState({players: players});
编辑:请停止提供有关如何使自己变得虚弱的答案。这个问题不是在问“自我”。 textView。 teeeeexttt viiieeewww。
答案 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。