这是在封闭中使用弱自我的正确地方吗?

时间:2018-08-15 17:21:33

标签: ios swift weak-references retain-cycle

我有一个具有collectionView出口的viewController。在cellForRowAt方法中,我将此代码称为:

guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as? MediaPhotoCell else {fatalError("Could not initialize cell")}
       cell.configureForMedia(obj, completion: { [weak self](image:UIImage?) in
            if let loadedImage = image {
                    let photo = self?.loadedPhotos[indexPath.row]
                    photo?.image = loadedImage
                    self?.loadedPhotos[indexPath.row] = photo
                    self?.photosViewController?.updateImage(for: photo)
                }
            })
return cell

我一直在花时间学习如何通过保留周期解决/防止内存泄漏。我在捕获闭包中的值之前添加了一个捕获列表[弱自我](image:UIIimage?)。我的逻辑是,由于viewController拥有collectionview,而那个collectionview拥有单元格,该单元格的自定义实现(自定义单元格)中有一个闭包方法,并且闭包引用了self,所以如果我不将self声明为,则我将创建一个保留周期弱。

这有必要吗?还是如果出口(collectionView)被声明为弱状态,这不是必需的吗?

1 个答案:

答案 0 :(得分:1)

您的示例可创建对自身的弱引用以用于闭包。

对于@IanMacDonald来说,您的示例不需要此评论,他也是正确的。 因此,如果self在闭包中可能为零,则只需要这样做。 使用[weak self]的一个很好的示例情况是在视图控制器中针对异步网络请求,该请求用于填充视图。如果用户退出,则不再需要填充视图,也不需要引用视图控制器。

我非常喜欢medium article这个关于闭包引用计数的方法。

快乐编码!