20

Ich möchte wissen, ob beide viewDidUnload und dealloc sind immer nacheinander in der UIViewController Abbauprozess aufgerufen. Ist es möglich, dass dealloc auf meinem View-Controller aufgerufen werden konnte, ohne dass zuvor viewDidUnload aufgerufen wurde? In beiden Fällen würde es kein Problem sein, wenn beide Methoden aufgerufen würden - aber ich frage mich, ob jemand das sicher weiß oder etwas Licht in die Sache bringen könnte der Abbauprozess.Werden viewDidUnload und dealloc immer aufgerufen, wenn ein UIViewController abgerissen wird?

2012 Update: Es ist praktisch zu beachten, dass, als ob iOS 6 viewDidUnload ist veraltet und sollte mit manueller Ansicht Teardown wenn in didReceiveMemoryWarning erneuert werden.

Ein guter Artikel über das neue UIView/UIViewContoller und das neue Verhalten und seine Auswirkungen auf die joe conway blog

Antwort

35

viewDidUnloadnicht jedes Mal wie dealloc Methode aufgerufen werden. viewDidUnload wird nur aufgerufen, wenn Ihre App eine Warnung zu wenig Speicher empfängt!

Denken Sie einfach, wenn Sie Ihr Objekt sowohl in viewDidUnload und dealloc Methoden freigeben. Wenn beide jedes Mal aufgerufen werden, geben Sie bereits freigegebene Objekte frei, was zum Absturz der Anwendung führen wird, oder? viewDidUnload ist ein Ort, der von Apple zur Verfügung gestellt wird, um die Dinge zu bereinigen, wenn die Warnung zu wenig Speicher empfangen wird, weil Sie wissen, dass wir im iPhone Speicherbeschränkungen haben.

+1

Ich denke, du meinst "viewDidUnload", wenn du 'viewDidLoad' in deiner Antwort sagst. 'viewDidLoad' wird nicht aufgerufen, wenn wenig Speicher vorhanden ist, aber wenn die Ansicht auf dem Bildschirm erscheint (vor' viewWillAppear'). 'viewDidUnload' wird aufgerufen, wenn eine Warnung zu wenig Speicher vorhanden ist. –

+0

Dies sollte die richtige Antwort sein. Das hat mich heute in Schwierigkeiten gebracht. – asandroq

+0

Es scheint, als wäre es in Ordnung, self.whatever = nil innerhalb von viewDidUnload zu machen und dann [_wasverage release] innerhalb von dealloc aufzurufen. Auf diese Weise wird, wenn viewDidUnload zuerst aufgerufen wird, das Element nicht durch delalloc überveröffentlicht, da es nicht ausgeführt wird und die Freigabemitteilung einfach wegfällt, wenn es an null gesendet wird. Kann das jemand bestätigen? – jpswain

0

Es ist ziemlich durchdacht, dass viewDidiUnload-Methode nur aufgerufen wird, wenn Speicherwarnung angezeigt wird. Eine gute Übung wäre, das Objekt innerhalb dieser Methode freizugeben und das Objekt gleich Null zu machen.

Verwandte Themen