2012-04-02 19 views
1

Die Methoden auf meinem root viewController viewWillDisappear, viewWillUnload viewDidUnload nie aufgerufen werden (haben jeweils Protokollanweisungen).viewWillDisappear, viewWillUnload viewDidUnload nie aufgerufen

Scheint so, als ob das hier schon mal vorkommt, aber die Antworten sind nicht ganz klar. Dieser scheint zu implizieren, dass die viewController-Ansicht in eine UINavigationController eingebettet werden muss, die seltsam erscheint und nichts, was ich irgendwo anders erwähnt habe.

viewWillDisappear and viewDidDisappear never get called

Wenn dies der Fall ist, wo sonst kann ich einige Bereinigungs tun und zu versichern, dass meine UIDocument Änderungen gespeichert werden?

BEARBEITEN Sie: Rate ich missverstanden @ wie die root ViewController Ereignisse funktionieren (es ist einzigartigen Status, etc). Schaut sich die AppDelegate-Methoden an. Ich versuche nur sicherzustellen, dass mein UIDocument-Material gespeichert wird und dass mein Core-Audio-Material korrekt geschlossen wird.

Schließen: Ende oben mit Benachrichtigungen von der AppDelegate. Scheint ziemlich gut zu funktionieren + einfaches Zeug, nachdem du es einmal getan hast.

// vom AppDelegate

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

[[NSNotificationCenter defaultCenter] postNotificationName: @"handleCleanup" 
                object: nil 
                userInfo: nil]; 
} 

und meine VC für die Benachrichtigung registriert:

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(saveAndCleanup) 
              name: @"handleCleanup" 
              object: nil]; 

Antwort

3

Wenn es Ihr Root-Ansicht ist, und Sie es sich nie ändern - dann ist es nicht verschwinden würde. ViewWillDisapear kann zwar aufgerufen werden, wenn Sie Ihre App in den Hintergrund stellen - ich kann mich nicht erinnern.

Ihr View-Controller wird nur entladen, wenn Sie eine Speicherwarnung erhalten, aber wenn er auf dem Bildschirm angezeigt wird - er wird nicht entladen.

viewWillDisappear:

Diese Methode in Reaktion auf eine Ansicht aufgerufen wird von einer Ansichtshierarchie entfernt. Diese Methode wird aufgerufen, bevor die Ansicht tatsächlich entfernt wird und bevor Animationen konfiguriert werden.

ViewDidUnload:

Wenn eine Low-Memory-Bedingung auftritt und die aktuellen Ansichten sind der View-Controller nicht benötigt werden, entscheiden kann das System diese Ansichten aus dem Speicher zu entfernen. Diese Methode wird aufgerufen, nachdem die View-Controller-Ansicht freigegeben wurde, und bietet die Möglichkeit, eine abschließende Bereinigung durchzuführen. Wenn Ihr View Controller separate Verweise auf die Ansicht oder ihre Unteransichten speichert, sollten Sie diese Methode verwenden, um diese Verweise freizugeben. Sie können diese Methode auch verwenden, um Verweise auf alle Objekte zu entfernen, die Sie zur Unterstützung der Ansicht erstellt haben, die aber jetzt nicht mehr benötigt werden, wenn die Ansicht nicht mehr vorhanden ist. Sie sollten diese Methode nicht verwenden, um Benutzerdaten oder andere Informationen freizugeben, die nicht einfach neu erstellt werden können.

+0

doh! Das macht Sinn. Ich teste im Simulator und erwartete, dass diese Ansichtsereignisse ausgelöst werden. Scheint wie das AppDelegate ist der richtige Ort, um meine Aufräumarbeiten zu behandeln. –

0

Ein typischer Ort, um unnötigen Cache oder Ressourcen freizugeben ist - (void)didReceiveMemoryWarning. Wenn Sie dies bei dieser Methode nicht getan haben, kann iOS Ihre App bei niedrigem Speichermoment beenden.

In Anbetracht der Art von mobilen Apps sollten Sie so oft wie möglich speichern.Eine typische Implementierung verwendet einen Timer zum automatischen Speichern. Manchmal kommt ein Anruf, iOS kann entscheiden, deine App zu beenden, anstatt sie in den Hintergrund zu stellen, weil du viel Speicher verwendest.

In einem anderen Hinweis, wenn - (void)didReceiveMemoryWarning aufgerufen wird, ist es sicher, dass Ihre Ansicht entladen wird. Dies bedeutet jedoch nicht, dass die App getötet wird. Das heißt, beim nächsten Öffnen der App wird viewDidLoad erneut aufgerufen. In diesem Sinne können Sie versuchen, die Datei in dieser Methode zu speichern.

Verwandte Themen