Container UIViewController Nicht Loslassen, das Kind von View-Controllern
Ich habe einen custom-container UIViewController, hat sechs untergeordnete UIViewControllers, und eine Reihe von Registerkarten, mit denen der Benutzer interagiert mit wechseln Sie zwischen den child-view-Controller. Das problem ist, wenn mein container view controller freigegeben wird das Kind view-Controller nicht.
Habe ich festgestellt, dass die child-view-Controller nicht freigegeben werden, durch hinzufügen von debugging-code zu Ihren dealloc Methoden, und Sie sind freigegeben, so lange als Ihr Blick ist nicht mehr auf die container view controller view.
Unten ist ein Auszug aus dem code, den ich verwende, um meine custom container view controller. Der viewController Zeiger sind iVars. Ich bin auch mit ARC, so dass ist, warum gibt es keine aktuelle Version fordert.
- (void)init
{
if ((self = [super init])) {
vc1 = [[UIViewController alloc] init];
[self addChildViewController:vc1];
vc2 = [[UIViewController alloc] init];
[self addChildViewController:vc2];
vc3 = [[UIViewController alloc] init];
[self addChildViewController:vc3];
vc4 = [[UIViewController alloc] init];
[self addChildViewController:vc4];
vc5 = [[UIViewController alloc] init];
[self addChildViewController:vc5];
vc6 = [[UIViewController alloc] init];
[self addChildViewController:vc6];
}
return self;
}
- (void)dealloc
{
[vc1 removeFromParentViewController];
vc1 = nil;
[vc2 removeFromParentViewController];
vc2 = nil;
[vc3 removeFromParentViewController];
vc3 = nil;
[vc4 removeFromParentViewController];
vc4 = nil;
[vc5 removeFromParentViewController];
vc5 = nil;
[vc6 removeFromParentViewController];
vc6 = nil;
}
- (void)switchFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController
{
if (fromViewController) {
[fromViewController.view removeFromSuperview];
}
[self.view addSubview:toViewController];
toViewController.view.frame = self.view.bounds;
}
Habt Ihr alle eine Idee, was ich falsch mache?
InformationsquelleAutor der Frage miken.mkndev | 2012-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie ich vermutete, das problem ist nicht im Zusammenhang mit der view-controller-containment-code in der Frage, sondern vielmehr Ihre addition der Beobachter (die Sie diskutieren in Ihrer Antwort auf diese Frage):
Ist und dass Sie versucht, es zu entfernen mit
So, es gibt zwei Probleme:
Wenn Sie
addObserverForName:object:queue:
ist dies nicht der richtige Weg, um entfernen dieser Beobachter. Stattdessen definieren Sie eine Eigenschaft, um zu verfolgen den Betrachter:Dann speichern Sie einen Verweis, dass Betrachter, wenn Sie es schaffen:
Und wenn Sie es entfernen möchten, verwenden Sie diesen Hinweis:
Die dafür sorgen würde, dass der Beobachter wäre ordnungsgemäß entfernt.
Dem scheitern des Kindes view-Controller freigegeben werden, während dieser Beobachter war an Ort und Stelle bedeutet, dass dieser block, dass Sie bestanden zu
addObserverForName:object:queue:
muss der hatte einen Verweis aufself
. Wenn Sie versucht haben, entfernen diese Beobachter richtig (wie oben gezeigt) indealloc
Sie würde immer noch eine starke Referenz-Zyklus (früher bekannt als retain-Zyklus). Dies wird gelöst, in eine Reihe von Möglichkeiten, aber die meisten robust-Muster ist zu verhindern, dass die starken Referenz-Zyklus, in Erster Linie durch die Verwendung derweakSelf
Muster:Meine ursprüngliche Antwort ist unten:
Während Srikanth ist richtig, dass nach
addChildViewController
sollten Sie rufendidMoveToParentViewController:self
und vorremoveFromParentViewController
sollten Sie rufenwillMoveToParentViewController:nil
. Aber das ist nicht dein problem. In der Tat habe ich eine variation des Codes (auch ohne diedealloc
), und die Kinder, die Controller sind veröffentlicht in Ordnung.Bottom-line, ich vermute, Ihr problem beruht woanders, vermutlich eine retain-Zyklus irgendwo. Zum Beispiel, machen Sie Kinder haben starken Bezug zu den Eltern? Sind Sie mit wiederkehrenden Timer? Sie verweisen einige Registerkarten. Sie sind nicht mit einem tab bar controller, sind Sie? Es muss etwas sein, dass.
[Siehe revision history-wenn Sie möchten, um zu sehen, rest der ursprünglichen Antwort mit code-snippets und kleine details auf dem OP-code-Beispiel]
InformationsquelleAutor der Antwort Rob
Dies ist nicht der Weg, um das hinzufügen und entfernen von untergeordneten view-Controller
ist der Weg, um zu entfernen und hinzufügen es ist
InformationsquelleAutor der Antwort Srikanth
Nach Stunden und Stunden, um herauszufinden, was Los war, ich endlich gefunden, was verursacht wurde, mein Kind, view-Controller die Freigabe richtig.
Jeden einzelnen view-controller hatte, die folgende Meldung erklärt, in jedem, so dass Sie reagieren auf verschiedene Ereignisse.
Stellt sich heraus, für einige Grund war, dass meine view-Controller die Freigabe richtig. Ich vermute, dass diese zusätzlichen den view-controller auf den NSNotificationCenters Beobachter-Liste, und das war nicht entfernt, wenn ich die folgende Zeile.
Also fix mein problem, ich habe gerade die Benachrichtigung zu registrieren, wie unten.
Ich habe keine Ahnung, warum die Art, wie ich war, die Registrierung der Benachrichtigung war nicht so dass meine view-controller zu release richtig, aber das ist wohl behoben haben. Wenn jemand keine Einsicht, warum dieses Problem passieren würde, dann lasst es mich bitte wissen.
Dank!
InformationsquelleAutor der Antwort miken.mkndev