2012-04-04 14 views
0

Ich habe eine benutzerdefinierte UIViewController-Unterklasse, die alle View-Initialisierungen selbst verwaltet (sie verwendet keine nib). Es gibt auch eine weitere UIViewController-Unterklasse, die von der Nib geladen wird. Beide sind in UITabBarController enthalten. Wenn eine Speicherwarnung kommt, erhält der erste Controller eine Benachrichtigung, aber viewDidUnload wird nicht aufgerufen. Der zweite Controller erhält ebenfalls eine Benachrichtigung und es wird viewDidUnload aufgerufen. Ich checkte in didReceiveMemoryWarning ein, self.isViewLoaded ist TRUE und self.view.superview ist null. Beide Controller (ihre Registerkarten) sind zum Zeitpunkt der Benachrichtigung nicht sichtbar.Benutzerdefinierter UIViewController viewDidUnload wird nie aufgerufen

Gibt es etwas Spezielles, das ein benutzerdefinierter Ansichts-Controller tun sollte, um in einem Ergebnis von Speicherwarnungen entladen zu werden?

+0

AFAIK, ist es ganz an das Betriebssystem. – borrrden

Antwort

1

Wenn Sie die Unterklasse UIViewContoller erstellen und sie nicht von einer NIB initialisieren, müssen Sie die -loadView-Methode von der Unterklasse trennen. Andernfalls geht iOS davon aus, dass die Ansicht nicht entladen/neu geladen werden kann.

Es würde ausreichen, um nur die Implementierung Folgendes zu Ihrer hinzufügen:

- (void)loadView { 
    [super loadView]; 
} 

Ich werde versuchen, eine Dokumentation Angebot für das zu finden.

The documentation is unfortunately not very clear on this matter.

+0

Vielen Dank, sehr hilfreich. – note173

+0

Sollte in der benutzerdefinierten loadView-Methode nicht [super loadView] aufrufen. Code wie folgt: self.view = [[[UIView alloc] initWithFrame: [UIScreen mainScreen] .applicationFrame] autorelease]; // Dies wird von Apple in dem oben zitierten Dokument notiert –

+0

Dies ist keine benutzerdefinierte Lade-Methode, sondern einfach und Implementierung, um das Framework wissen zu lassen, dass diese Ansicht neu erstellt werden kann. – FelixLam

0

Ich würde die Dokumentation auf dem View Controller Lifecycle überprüfen. Schauen Sie sich speziell an, was passiert, wenn die Speicherwarnung empfangen wird. Wenn die Ansicht Ihres benutzerdefinierten Ansichtscontrollers die Ansicht auf dem Bildschirm ist, versucht das Betriebssystem nicht, diese Ansicht freizugeben. Wird diese Ansicht auf dem Bildschirm angezeigt, wenn Sie die Speicherwarnung erhalten? Navigieren Sie im Simulator zur Ansicht "Nib-geladen" und simulieren Sie eine Speicherwarnung. Prüfen Sie, ob Ihre benutzerdefinierte Ansicht dann freigegeben wird. Siehe auch, ob viewWillUnload aufgerufen wird. Und stellen Sie sicher, dass in jeder dieser Methoden, die Sie überschreiben, dass Sie Super aufrufen.

+0

Er sagte "Beide Controller (ihre Registerkarten) sind zum Zeitpunkt der Benachrichtigung unsichtbar." Was macht diese Frage interessant? – lnafziger

+0

Nun, nicht die klarste Frage. Ich kann einen View-Controller in einem Tab-Controller haben und die Tab-Leiste ausblenden. Das wäre für mich dasselbe wie "die Tabs verstecken". Meine Tabs sind zwar versteckt, aber meine Ansicht ist immer noch auf dem Bildschirm. Der Tab-Bar-Controller ist nur ein Controller von Controllern. – jmstone617

Verwandte Themen