闭包中的弱引用

Dee*_*ora 7 closures swift

我需要在闭包内使用self的弱引用.我为此目的使用以下代码:

func testFunction() { 
    self.apiClient.getProducts(onCompletion:  { [weak self] (error, searchResult) in     
        self?.isSearching = false
     }
}
Run Code Online (Sandbox Code Playgroud)

我可以在testFunction的主体中声明self的弱引用,而不是在关闭的捕获列表中给出弱引用.

func testFunction() { 
     weak var weakSelf = self
     self.apiClient.getProducts(onCompletion: {(error, searchResult) in     
         weakSelf?.isSearching = false
     }
}
Run Code Online (Sandbox Code Playgroud)

类似的,Objective-C中也使用了语法来使用块内的弱引用.

__weak typeof(self) weakSelf = self; 
Run Code Online (Sandbox Code Playgroud)

在闭包中通过捕获列表指定弱引用是否有任何优势,而不是在函数体中声明弱变量.如果函数体中有多个闭包,则在函数体中声明弱变量并在所有闭包中使用相同的变量而不是在每个闭包中写入捕获列表更有意义.

Rob*_*ier 2

它们的行为应该相同。您使用哪种方式取决于风格。我不认为这两种方法特别好。

值得注意的是,在这两种情况下都可能没有必要使用weak。如果getProducts编写正确,这段代码应该只创建一个临时保留循环,而不是永久循环。调用完成处理程序后,它应该释放闭包,释放 self 并中断循环。self所以问题是在这一切完成之前被摧毁是否合理和可取,以及你是否真的想要weak这里。对于这些情况,我经常使用强指针。(这也是一个风格和观点的问题。对于习惯使用有争论weak,我只是觉得在很多情况下这是一个不必要的麻烦。)