2017-11-29 4 views
0

In meinem iOS-App Ich habeSwift beibehalten Zyklen

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; 
    } 
} 

mit Instrumenten, ich habe einige Speicherlecks beobachtet, und ich denke, das Problem in Zeile (1) angegeben ist.

Könnte jemand mir erklären, wenn es ein Zyklus beibehalten erzeugt? Wenn ja, wie lösen Sie es?

Antwort

0

Es schafft in der Tat einen behalten Zyklus: Ihr Knoten behält in flattenElementsCache sich eine Referenz.

Sie können die Linie gekennzeichnet durch (1), löschen und stattdessen die Schleife ändern:

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

Offensichtlich, es zu lösen, anstatt starke schwache Referenz verwenden.

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

aber ich bin mir nicht sicher, ob es Zyklus Referenz erscheint

Verwandte Themen