[英]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.