Утечка памяти, вызванная [слабым я] в Swift - PullRequest
0 голосов
/ 14 сентября 2018
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] может это исправить?

1 Ответ

0 голосов
/ 15 сентября 2018

«Слабая» ссылка должна занимать больше ресурсов, чем «неизвестная».Во время выполнения, когда объект, на который ссылаются еженедельно, освобождается, происходит процесс сброса «слабых» указателей на этот объект на «ноль».С другой стороны, «неизвестный» указатель не отслеживается таким образом.

...