封闭中的参考不足

时间:2018-08-15 07:41:00

标签: swift closures

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

location != string::npos

我可以在testFunction的主体中声明self的弱引用,而不是在闭包的捕获列表中提供弱引用。

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

类似地,Objective-C也使用语法在块内部使用弱引用。

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

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

1 个答案:

答案 0 :(得分:2)

这些行为应相同。您使用哪种将取决于样式。我不会认为这两种方法特别好。

值得注意的是,在任何一种情况下都可能不需要使用弱函数。如果正确编写了getProducts,则此代码应仅创建一个临时的keep循环,而不是永久的。调用完成处理程序后,它应释放闭包,释放自身并中断循环。因此,问题是,在完成之前销毁self是否合理且可取,因此您是否真的想要weak在这里。在这些情况下,我经常使用强指针。 (这也是样式和意见的问题。weak的惯用用法有很多争议,在很多情况下,我只是觉得这是不必要的麻烦。)