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:
Wenn ich das nicht tue, setze UIViewControllerAnimatedTransitioning
und UIViewControllerTransitioningDelegate
in eine separate NSObject
namens TransitionController und setze sie wie folgt:
Das UIViewController
ist nicht zugeordnet , aber ich erhalte Speicherlecks beim TransitionController-Objekt. Tut jemand jetzt was ich falsch mache?
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:
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 self = eine Instanz von VCA
myModalViewController = ist eine starke Eigenschaft von self
self = eine Instanz von VCA
myModalViewController = die zuvor präsentierte modal präsentierte Instanz von VCB
Ich hoffe, das hilft. Es hat sicherlich für mich getan.
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
:
Arbeitete wie ein Zauber (:
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.
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.
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.
Tags und Links objective-c ios uiviewcontroller