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
指定为弱。