我有一个具有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)被声明为弱状态,这不是必需的吗?
答案 0 :(得分:1)
您的示例可创建对自身的弱引用以用于闭包。
对于@IanMacDonald来说,您的示例不需要此评论,他也是正确的。
因此,如果self在闭包中可能为零,则只需要这样做。
使用[weak self]
的一个很好的示例情况是在视图控制器中针对异步网络请求,该请求用于填充视图。如果用户退出,则不再需要填充视图,也不需要引用视图控制器。
我非常喜欢medium article这个关于闭包引用计数的方法。
快乐编码!