簡體   English   中英

快速保持周期

[英]Swift Retain Cycles

在我的iOS應用中

class Node {
    var value: String
    var isExpanded: Bool
    var children: [Node] = []

    private var flattenElementsCache: [Node]!

    // init methods

    var flattenElements: [Node] {
        if let cache = flattenElementsCache {
            return cache
        }
        flattenElementsCache = []
        flattenElementsCache.append(self) // (1) <-- Retain Cycle???
        if isExpanded {
            for child in children {
                flattenElementsCache.append(contentsOf: child.flattenElements)
            }
        }
        return flattenElementsCache;
    }
}

使用Instruments,我已經觀察到一些內存泄漏,並且我認為問題與(1)所示一致。

誰能向我解釋一下是否會產生保留周期? 如果是,您如何解決?

它確實創建了一個保留周期:您的Node在flattenElementsCache保留了對自身的flattenElementsCache

您可以刪除以(1)標記的行,而將循環更改為:

for child in children {
    flattenElementsCache.append(child)
    flattenElementsCache.append(contentsOf: child.flattenElements)
}

顯然,要解決此問題,請使用弱引用而不是強引用。

class Node {
    var links: [Node?] = []
    init() {
        weak var weakSelf = self
        links.append(weakSelf)
    }
}

但我不確定是否出現參考周期

暫無
暫無

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

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