swift中由[弱自我]引起的内存泄漏

问题描述 投票:0回答:1
func addAdditionalElement(_ additionalSelectedElementsIDs: [String], startX: CGFloat, containerView: UIView, viewHeight: CGFloat) -> CGFloat {
    var totalWidth = startX

    if additionalSelectedElementsIDs.count > 0 {

        let paddingBeforeLabel = (totalWidth==0 ? 0:paddingBetweenLabels)
        totalWidth += paddingBeforeLabel
        var countLabel = createLabel("+\(additionalSelectedElementsIDs.count)", shouldStrikethrough: false)
        if let filter = filter as? DsFilter {
            if filter.isRAOptimization() {
                countLabel = createLabel("...", shouldStrikethrough: false)
            }
        }
        countLabel.frame = CGRect(x: totalWidth, y: 0, width: countLabel.frame.size.width, height: viewHeight)
        countLabel.layer.cornerRadius = countLabel.frame.size.height / 2
        addLabel(countLabel, containerView: containerView)
        DispatchQueue.main.async { [weak self] in
            guard let isSubset = self?.filter.isSelectedElementsSubset(elementsIDs: additionalSelectedElementsIDs) else { return }
            self?.updateLabelSelectedState(countLabel, isTemporarySelected: !isSubset)
        }
        totalWidth += countLabel.frame.size.width
    }
    return totalWidth
}

通过仪器在DispatchQueue.main.async { [weak self] in线找到泄漏点。它可以通过使用[unowned self]来修复,但我不能保证零的情况。

我只是好奇内存泄漏的原因,为什么[weak self]会导致内存泄漏?它不是嵌套的闭包,捕获看起来很好......另外,为什么使用[unowned self]可以解决这个问题?

swift memory-leaks closures weak-references
1个回答
0
投票

'弱'参考应该比'无主'需要更多的资源。在运行时,每周引用的对象被释放,有一个过程将该对象的“弱”指针重置为“nil”。另一方面,'无主'指针没有像这样跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.