簡體   English   中英

快速[弱自我]引起的內存泄漏

[英]A memory leak caused by [weak self] in swift

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]可以解決此問題?

“弱”引用應該比“無人”引用占用更多資源。 在運行時,如果每周引用的對象被釋放,則有一個將指向該對象的“弱”指針重置為“ nil”的過程。 另一方面,不會像這樣跟蹤“無主”指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM