RXSwift闭包中的'[弱自我]'

Roh*_*hal 31 closures swift rx-swift

我是否需要[weak self]在RXSwift subscribeNext闭包内使用?

我有代码:

    searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { searchText in
        self.viewModel.searchForLocation(searchText)
    }.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag)
Run Code Online (Sandbox Code Playgroud)

我是否需要修改它以便[weak self]在闭包开始时有一个捕获列表?像这样:

    searchController.searchBar.rx_text.throttle(0.2, scheduler: MainScheduler.instance).subscribeNext { [weak self] searchText in
        self?.viewModel.searchForLocation(searchText)
    }.addDisposableTo(DisposelBag.sharedDisposelBag.disposeBag)
Run Code Online (Sandbox Code Playgroud)

zap*_*aph 18

如果闭包不属于您不必使用的类[weak self].

在内联闭包的情况下,闭包不是由类所拥有,而是由它所在的范围所有,并且在保留范围时将被释放.

如果关闭被传递,它可能或可能不属于类(例如属性),并且谨慎使用[weak self]incase它是由类拥有的.

  • 你的答案有点令人困惑.如果闭包是由作用域拥有的,例如函数,则在调用该函数之后永远不会调用闭包.闭包由你正在观察的对象拥有,在这种情况下是`searchBar`.因此,如果以某种方式`self`对`searchBar`有强烈的参考,OP应该使用`weak` (4认同)

Son*_*yen 14

是的,self如果self在闭包内访问,则应该创建一个弱捕获,并且可能在闭包被调用之前self成为可能nil.

如果一个闭包捕获self然后self变成nil,当调用闭包并尝试访问它时self,你会得到一个例外.

感谢scotteg,他在GitHub上有一个示例项目:https://github.com/scotteg/TestRxSwiftClosures

请参阅DetailViewController示例中的内容.

您可以取消注释其他两个示例,一次一个,以查看结果.第一个根本没有定义捕获列表,第二个定义unowned捕获.运行应用程序并输入一些文本,然后在5秒内点击完成(每个闭包有5秒的延迟).前两个示例将导致抛出异常.

基本规则是:如果可以将捕获(例如self)设置为nil,例如,如果它引用的实例被解除分配,则将捕获定义为weak.否则,如果该封内的封闭和捕捉将始终称呼对方,并在同一时间被释放,定义捕捉为unowned.