2016-10-09 2 views
2

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

+1

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

+0

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

+1

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

Antwort

1

Sie haben einen Fehler in dem Leckdetektor gefunden können, und es könnte durchaus ein interessanter Fehler sein, so sollten Sie es an Apple melden. Aber es gibt tatsächlich kein Leck. Ich habe Ihr Projekt heruntergeladen und unter Instrumente ausgeführt und den Knopf 10 Mal gedrückt. Das ist, was ich sah in Instruments Zuteilungen Vorlage:

enter image description here

Das ist das erwartete Ergebnis ist. Es gibt 9 vorübergehende Dinge und nur ein hartnäckiges Ding - dasjenige, das der Eigenschaft gegenwärtig zugewiesen ist. Ein Leck wäre, wenn es mehr als ein persistentes Ding gäbe, und das ist nicht der Fall.

Auch ist es das, was die Speicheranzeige wie in Xcode aussieht:

enter image description here

Wir haben einen kleinen Anstieg (eine Art „Mesa“), wenn ich die Taste wiederholt tippen, aber dann werden wir abrechnen wieder zurück auf die Basisebene.

Verwandte Themen