闭包中的弱引用

7

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

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

在闭包的捕获列表中给出弱引用的方式,能否在testFunction的主体中声明self的弱引用呢。

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

类似地,Objective-C中也使用了相似的语法,在块内使用弱引用。

__weak typeof(self) weakSelf = self; 

在闭包中通过捕获列表指定弱引用是否比在函数体中声明一个弱变量有优势呢? 如果函数体中有多个闭包,那么在函数体中声明一个弱变量并在所有闭包中使用相同的变量,比在每个闭包中都写成一个捕获列表更加明智。

1个回答

2

这两种方法的行为应该是相同的。你使用哪个取决于个人风格。我不认为其中任何一种方法特别好。

值得注意的是,在这两种情况下,使用weak可能是不必要的。如果getProducts被正确编写,此代码只会创建一个临时保留循环而不是永久性的循环。在完成处理程序调用后,它应该释放闭包,释放self并打破循环。因此,问题是在完成之前是否合理和可取让self被销毁并消失,以及你是否真正需要在这里使用weak。我经常在这些情况下使用强指针。(这也是一种风格和观点。有关习惯使用weak的论点,我只是发现在许多情况下它是一个不必要的麻烦。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接