Ich konnte ein Problem in einer App, die ich geschrieben habe, destillieren und in einem einfachen Beispiel reproduzieren.Objekthierarchie verursacht einen Speicherverlust in Swift
Unter diesen Klassen:
class Thing {
var name:String = ""
var price:Double = 0.0
var changed:Double = 0.0
var percentChanged:Double = 0.0
}
class TestUIViewController: UIViewController {
}
class ViewController: TestUIViewController {
var thing:Thing?
@IBAction func clicked(_ sender: AnyObject) {
self.thing = Thing()
}
}
habe ich eine UIView mit einer Taste, dass, wenn sie gedrückt, ein Ding instanziiert wird. Mit dem Profiler von Instruments kann ich sehen, dass Speicherlecks auftreten.
Wenn jedoch die ViewController-Klasse von UIViewController aus erweitert wird, treten keine Probleme auf.
Das wurde alles von einer schnellen Test-App reproduziert, so dass es hier keine anderen äußeren Kräfte gibt, die ich mir vorstellen kann. Hier
ist der Beispielcode - https://www.dropbox.com/s/ooqh77lhpzbvpv1/ArcTest.zip?dl=0
Versuchen Sie, Deinit-Methoden mit Breakpoints in jeder Klasse hinzuzufügen und lassen Sie uns wissen, welche von ihnen aufgerufen werden und welche nicht, nachdem Sie ViewController-Instanz von Navigation Stack stapled (oder modal entlassen). Wenn alle af sie aufgerufen werden, haben Sie keinen Grund zur Sorge und wahrscheinlich ist etwas falsch mit Profiler selbst – alexburtnik
Alex, der Deinit wird definitiv aufgerufen. Bevor ich dies in Profiler bemerkte, sah ich den Speicher aus der Xcode-Debug-Sitzung aufbauen. Wenn Ihr Gefühl ist, dass es ein Profiler Problem ist, das ist gut genug für mich. Ich erstelle keine Ansichten neu oder platziere sie von einem Stapel. – Brian
Vielleicht ist das Problem Ihre Verwendung von Instrumenten? Was bedeutet "Ich kann sehen, dass Speicherlecks auftreten"? Was siehst du eigentlich? Hast du das Leaks-Instrument benutzt? Haben Sie auch die neue Xcode 8 Memory Graphing-Funktion verwendet? – matt