1

我有一个问题,由于内存泄漏,在用于使用 RxDataSource 的 CollectionView 的 dataSource 函数中 [unowned self] 更改为 [weak self]。我现在收到了返回一个没有reuseIdentifier 的空白collectionViewCell 的崩溃。我知道我需要返回一个带有重用 ID 的单元格。

建议进行哪些更改以正确处理此问题?

有人建议在 viewDidLoad() 中设置 collectionView.dataSource = nil 可以解决这个问题......

我在想而不是在'guard'检查中返回CanvasItemCollectionViewCell(),我返回collectionView.dequeueReusableCell(for:indexPath,cellType:CanvasItemCollectionViewCell.self),但是如果self = self失败,这不意味着collectionView是垃圾吗?

这是一个难以调试的问题,因为这种崩溃不会始终如一地发生。

这里有一些截图来描绘我正在看的东西。

RxData源代码:

func dataSource()
        -> RxCollectionViewSectionedAnimatedDataSource<CanvasSectionModel> {
        RxCollectionViewSectionedAnimatedDataSource<CanvasSectionModel>(
            animationConfiguration: AnimationConfiguration(
                insertAnimation: .fade,
                reloadAnimation: .fade,
                deleteAnimation: .fade
            ),
            configureCell: { [weak self] dataSource, collectionView, indexPath, _ in
                guard let self = self else { return CanvasItemCollectionViewCell() }
                
                switch dataSource[indexPath] {
                case let .CellModel(model):
                    let cell = collectionView
                        .dequeueReusableCell(
                            for: indexPath,
                            cellType: CanvasItemCollectionViewCell.self
                        )

                    cell.model = model

                    cell.onDeleteHandler = { _ in
                        self.presentDeleteConfirmation { deleteConfirmed in
                            guard deleteConfirmed else { return }
                            self.viewModel.inputs.deletePage(withProofID: model.id)
                        }
                    }

                    return cell
                }
            }

崩溃

在此处输入图像描述

4

1 回答 1

1

最终,问题出在这里:

cell.onDeleteHandler = { _ in
    self.presentDeleteConfirmation { deleteConfirmed in
        guard deleteConfirmed else { return }
        self.viewModel.inputs.deletePage(withProofID: model.id)
    }
}

不要使用self,你不会有自我引用的问题,所以你不需要导入一个弱自我,然后担心守卫让自我......

  • 对于第一个self参考,将其替换为UIViewController.top()(请参阅下面的实现。)
  • 对于第二个参考,请改为self捕获。viewModel
extension UIViewController {
    static func top() -> UIViewController {
        guard let rootViewController = UIApplication.shared.delegate?.window??.rootViewController else { fatalError("No view controller present in app?") }
        var result = rootViewController
        while let vc = result.presentedViewController, !vc.isBeingDismissed {
            result = vc
        }
        return result
    }
}
于 2021-06-10T18:58:56.907 回答