2016-05-25 9 views
1

Ich weiß, dass das folgende ein Speicherverlust verursacht, weil sich MyClass und myClosure gegenseitig referenzieren.Wird diese Schließung ein Speicherleck verursachen?

var MyClass { 
    var myVar = 0 
    let myClosure: (Int) -> Void 

    init() { 
     self.myClosure = { x in 
      self.myVar = x 
     } 
    } 
} 

Führt das Folgende auch zu einem Speicherverlust? Warum oder warum nicht?

var MyClass { 
    var myVar = 0 

    function myFunc() { 
     let myClosure = { x in 
      self.myVar = x 
     } 

     myClosure(0) 
    } 
} 

Antwort

0

Nein, dies wird (in der Praxis) keine Speicherlecks verursachen. myClosure() ist lokal innerhalb myFunc() definiert. Wenn myClosure(0) aufgerufen wird, wird die Schließung für die Ausführung geplant, und wenn es fertig ist, wird es aus dem Speicher entfernt.

Das einzige Problem, das Sie mit Ihrem Code haben, ist, dass self, in Ihrer Schließung, eine starke Referenz ist, die bis zur Ausführung der Schließung freigegeben werden kann. Dies führt zu einem schlechten Überlauffehler. Stellen Sie sicher, dass Sie einen schwachen Verweis auf Selbst erstellen, und verwenden Sie das in Ihrem Abschluss.

+4

Selbst in diesem Fall zu vermeiden Aufruf kann nicht freigegeben werden, weil es eine starke Referenz. Der einzige Fall, in dem es zu einem schlechten Zugang führen kann, ist, wenn Sie unowned self verwenden. – stefos

+1

Es ist tatsächlich besser so, weil die Aufhebung der Zuordnung nicht gestartet wird, bis die Funktion beendet ist – Daniel

0

Deklarieren schwaches Selbstspeicherleck und Wache selbst, um zu vermeiden deallokierten Selbst

func myFunc() { 
    let myClosure = { [weak self] x in 
     guard let strongSelf = self else { 
      return 
     } 

     strongSelf.myVar = x 
    } 

    myClosure(0) 
} 
Verwandte Themen