在我的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中保留了对自身的引用。

您可以删除以(1)标记的行,而将循环更改为:

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

关于ios - 快速保持周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47551099/

10-11 14:37