Swift 是否应使用'指定计算属性;弱';当引用弱ref变量时?

Swift 是否应使用'指定计算属性;弱';当引用弱ref变量时?,swift,swift2,Swift,Swift2,我构建了一棵树,其树节点如下所示: class TreeNode { var isRoot: Bool { return parentNode == nil } var childNodes = [TreeNode]() weak var parentNode: TreeNode? private weak var _rootNodeCache: TreeNode? var rootNode: TreeNode? {

我构建了一棵树,其树节点如下所示:

class TreeNode {
    var isRoot: Bool {
        return parentNode == nil
    }
    var childNodes = [TreeNode]()
    weak var parentNode: TreeNode?
    private weak var _rootNodeCache: TreeNode?
    var rootNode: TreeNode? {
        return _rootNodeCache
    }
    private func updateRootCache(node: TreeNode) {
        ...// Implementation doesn't matter.
    }
}
我想问一下,计算属性
rootNode
是否应该用
weak
指定?
在没有弱的情况下运行似乎没问题。但我担心这会导致泄漏。

只有当您有循环引用时,才需要使用
弱。我知道你有一个(父母)
TreeNode
TreeNode
孩子。父项对每个子项都有强引用,因此从子项返回到父项的任何引用都必须
,否则两者都不会破坏。您已通过将
parentNode
标记为弱来完成此操作

对于
rootNode
,您只需要担心它返回什么。由于它返回的
\u rootNodeCache
(弱),因此您将没有循环引用。你可以用下面的代码来证明这一点。从
rootNode
添加或删除弱节点没有任何区别。但是,从
\u rootNodeCache
parentNode
中删除弱节点会导致循环引用,并且不会调用deinit

class TreeNode {
    var name: String = ""
    var childNodes = [TreeNode]()
    weak var parentNode: TreeNode?
    private weak var _rootNodeCache: TreeNode?
    var rootNode: TreeNode? {
        return _rootNodeCache
    }
    init(_ name: String, _ root: TreeNode?, _ parent: TreeNode?) {
        self.name = name
        _rootNodeCache = root
        parentNode = parent
        if let parent = parent {
            print("Adding \(name) to \(parent.name)")
            parent.childNodes.append(self)
        }
    }
    deinit {
        print("deinit \(name) \(childNodes.count) children")
    }
    func show() {
        print("\(name) has \(childNodes.count) children")
        for child in childNodes {
            child.show()
        }
    }
}

func addChildren(root: TreeNode) {
    let child = TreeNode("child", root, root)
    TreeNode("grandchild", root, child)
}

var root: TreeNode? = TreeNode("root", nil, nil)
addChildren(root!)
root!.show()
root = nil

据说计算属性不存储任何对象。让我困惑的是:如果没有弱说明符,
\u rootNodeCache
通过
rootNode
被视为强引用?如果是这样,是否存在泄漏?苹果文档声明计算属性不存储值,因此
\u rootNodeCache
不会通过
rootNode
被视为强引用,因为
\u rootNodeCache
被声明为弱引用。因此不会出现泄漏,也不需要将
rootNode
指定为弱。