Diese Zeile:
[window addSubview:nav.view];
NICHT einen Blick auf den Bildschirm sofort hinzuzufügen. Es wird vom Betriebssystem in einer zukünftigen Laufschleife auf einem möglicherweise anderen Thread angezeigt. Die tatsächliche Implementierung können wir nicht sicher sein.
Aus diesem Grund definiert Apple Delegate-Methoden wie viewDidAppear/viewWillAppear, sonst würden wir sie nicht benötigen, da wir genau wissen würden, wann diese Ereignisse auftreten.
Außerdem fügt das Hinzufügen einer Unteransicht, wie Sie gesagt haben, in der Tat die Ansicht. Es tut NICHT aber behalten Sie die Ansicht Controller oder der Navigation Controller. Da der Navigationscontroller WILLS alle hinzugefügten View-Controller behält, müssen wir sie nicht mit einem ivar-Befehl zurückhalten.
Aber Ihr Verweis auf den Navigationscontroller muss bestehen über den Rahmen der Methode hinaus. oder abhängig von Ihrem Code könnte es freigegeben werden oder seine Referenz verloren haben.
So können Sie einen Verweis auf die Navigationssteuerung mit einem Ivar halten müssen und es wie so gesetzt:
self.navigationController = nav;
Also auch wenn nav.view einen Zeiger auf testViewController.view enthält, hat die Anwendung keinen Hinweis des Navigationscontroller und, als Erweiterung, die Ansicht. Das Ergebnis ist ein leerer Bildschirm.
Um dies deutlicher zu machen, dass es nicht behalten/release Problem ist, Sie sind in der folgenden Methode tatsächlich undicht:
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Sie müssen Ihre Autorelease behalten/releases auszubalancieren von: So
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
, das bedeutet, dass Ihre Sicht hat nie, nie jederzeit aufgehoben worden Sie diesen Code ran. Was uns weiter versichert, dass Ihr Thema in der Tat eine verlorene Referenz ist.
Ihre markierte Antwort ist nicht korrekt, aus Gründen, die ich unten kommentiert habe. –