benutzerdefinierter iOS 7 UIViewController-Übergangs-Retain-Zyklus

8

Ich erstelle benutzerdefinierte Übergänge in meiner App und führe zwei Probleme aus. Wenn ich den View-Controller so eingestellt habe, dass er sowohl UIViewControllerAnimatedTransitioning als auch UIViewControllerTransitioningDelegate behandelt, stoße ich auf das Problem, dass mein View-Controller niemals freigegeben wird. Dies erzeugt insbesondere den Retain:

%Vor%

Wenn ich das nicht tue, setze UIViewControllerAnimatedTransitioning und UIViewControllerTransitioningDelegate in eine separate NSObject namens TransitionController und setze sie wie folgt:

%Vor%

Das UIViewController ist nicht zugeordnet , aber ich erhalte Speicherlecks beim TransitionController-Objekt. Tut jemand jetzt was ich falsch mache?

    
kelly 12.11.2013, 06:56
quelle

5 Antworten

6

Ich stieß auf das gleiche Problem und war in der Lage, es zu lösen.
Die benutzerdefinierte Übergangs-API ist nicht so gut dokumentiert und erforderte eine Menge Versuch und Irrtum, um alles richtig zu machen.

Lassen Sie mich durchgehen, wie ich es ohne Speicherprobleme funktionierte:

Hier sind die Spieler:

VCA = Der View-Controller, der VCB modal präsentieren möchte VCB = Der modal präsentierte View-Controller (präsentiert von VCA)

TC = Das benutzerdefinierte Transition-Controller-Objekt, das die benutzerdefinierte Animation ausführt.
NSObject-Unterklasse, die " UIViewControllerAnimatedTransitioning " entspricht.
Wird in TD instanziiert.

TD = Das benutzerdefinierte Übergangsdelegatenobjekt, das den Übergangscontroller für das System bereitstellt. NSObject-Unterklasse, die " UIViewControllerTransitioningDelegate "

entspricht

Nun wollen wir eine Instanz von VCB vorstellen

self = eine Instanz von VCA
myModalViewController = ist eine starke Eigenschaft von self

%Vor%

Irgendwann später bittet VCB VCA, entlassen zu werden

self = eine Instanz von VCA
myModalViewController = die zuvor präsentierte modal präsentierte Instanz von VCB

%Vor%


Ich hoffe, das hilft. Es hat sicherlich für mich getan.

    
tiescher 29.12.2013, 19:34
quelle
2

In meinem Fall hatte ich selbst ( UIViewController ) eine Instanz einer benutzerdefinierten UIViewController (nennen wir sie mViewController ) und self ist die transitioningDelegate von mViewConroller anzeigen / ablehnen. Meine Lösung, Retain-Cycle zu vermeiden, bestand darin, dies in .m von mViewController :

zu nennen %Vor%

Arbeitete wie ein Zauber (:

    
Aviel Gross 19.01.2014 15:30
quelle
0

Beim zweiten Versuch vergeben Sie eine TransitionController -Instanz und sie wird niemals freigegeben (da niemand einen Verweis darauf hat). Die Objekte sollten niemals ihre Delegaten in Objective-C behalten, daher müssen Sie einen Verweis auf Ihre ViewController und auf ihre delegate von einem anderen Punkt in Ihrem Code haben.

    
Dave 12.11.2013 08:14
quelle
0

Das UIViewControllerAnimatedTransitioning -Objekt wird von der 'from' VC beibehalten, nachdem der Übergang in iOS7 abgeschlossen ist (dies passiert nicht in iOS8), was zu Speicherverlusten führen kann, wenn Ihr Übergangsobjekt etwas speichert Eigenschaften. Das hat mich in die Vergangenheit gebissen, etwas, vor dem man aufpassen sollte.

    
Chris 14.05.2015 02:27
quelle
0

In meinem Fall war die Ursache für die Beibehaltung meines präsentierten View-Controllers, dass ich den falschen booleschen Wert an den Completion-Block meiner Animation übergeben habe.

%Vor%

Es hätte das sein sollen:

%Vor%

Die Aufteilung des Codes in zwei Zeilen erleichtert die Lesbarkeit.

    
Matt Quiros 05.12.2016 07:20
quelle