2017-01-15 2 views
-1

Ich fragte mich, ob es einen einfachen Weg (oder zumindest einen Weg) gab, um herauszufinden, wo in Ihrem Programm Retain-Zyklen existieren. Wenn ich dann weiß, wo diese Rückhaltezyklen existieren, abhängig von ihren Typen (z.B. Variable oder Schließung), wie mache ich sie schwach. Ich muss alle Retain-Zyklen mit self (my GameScene) stoppen, damit es sich wieder ausschaltet, wenn ich es nicht mehr brauche und ich es neu starten möchte.Wissen, wo die Retain-Zyklen sind und sie entfernen

Alle Tipps, Ratschläge, Antworten und Rückmeldungen würden sehr geschätzt werden (und die Bereitstellung von spezifischen Code und Beispielen wäre vorzuziehen). Vielen Dank.

Bearbeiten: @ Sweeper die Antwort war genau das, was ich gesucht habe. Wenn Sie das gleiche Problem haben, wird seine Antwort helfen. Danke @Sweeper!

+1

Hier haben Sie ziemlich alles über Ihr aktuelles Problem beantwortet: http://StackOverflow.com/a/41660653/3402095 Antwort auf diese Frage wäre auch Apple Dokumentation, ARC - "Starke Referenz Zyklen zwischen Klassen Instanzen" Abschnitt, Teil mit Person & Apartment. – Whirlwind

+1

Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –

+0

@ Whirlwind Sweepers Antwort war, was ich von dieser Antwort nicht wissen wollte. Vielen Dank für Ihre Antwort –

Antwort

9

Wenn Sie Xcode 8 oder höher verwenden, können Sie mithilfe des Speicherdiagramms dingy sehen, welches Objekt einen Verweis auf welches Objekt enthält.

Um das Speicherdiagramm zu sehen, erstellen und starten Sie zuerst Ihre App mit Xcode. Wenn Sie, ob alle Instanzen überprüfen möchten Sie ordnungsgemäß entsorgt erstellt werden, auf der linken Seite auf dieser Registerkarte gehen:

enter image description here

dann die Taste auf der rechten Seite drücken:

enter image description here

Danach wählen Sie die am weitesten unten Option - Ansicht Speicher Graph Hierarchie:

enter image description here

Jetzt wird es Ihnen, alle Objekte zeigt, die im Speicher sind:

enter image description here

In meinem Fall, ich habe ein GameSystem Objekt, 6 ButtonNode Objekte und ein paar andere. Sie werden feststellen, dass neben dem Objekt GameSystem ein kleines ! Objekt vorhanden ist. Das bedeutet, dass dieses Objekt durchgesickert ist. Außerdem sollte GameScene nicht mehr im Speicher sein, da die aktuelle Szene TitleScene ist. Mal sehen, was es wird beibehalten, indem Sie auf die Instanz klicken:

enter image description here

Jetzt kann man deutlich sehen, dass es durch einen Verschluss gehalten wird!

So verwenden Sie das Speicherdiagramm, um zu sehen, wo Sie schwache Referenzen setzen und Retain-Zyklen vermeiden sollten.

+0

Schöne Antwort ... Ich habe das komplett vergessen, weil ich für immer auf Xcode 7.x war.x und gerade erst zur neuesten Version gewechselt. Scheint, dass es ziemlich gut funktioniert, wenn es um die Erkennung von Lecks geht. Es ist auch nervig, dass dies bei Swift 2.3-Projekten nicht funktioniert – Whirlwind

Verwandte Themen