De levenscyclus van UIViewController omvat de volgende belangrijke methoden:
init(nibName:bundle:) / init(coder:): initialisatieloadView: creëren van de view-hiërarchieviewDidLoad: view is geladen (ideale plek voor initiële opstelling)viewWillAppear / viewDidAppear: view verschijnt/verschenenviewWillDisappear / viewDidDisappear: view verdwijnt/verdwenendeinit: verwijderen van de controllerDe volgorde van aanroepen van de methoden:
loadView, dan viewDidLoad)viewWillAppear/viewWillDisappear aangeroepen, daarna viewDidAppear/viewDidDisappeardeinitPunten:
viewDidLoad moet je geen toegang vragen tot de afmetingen van de view — deze kunnen niet actueel zijndeinit of viewWillDisappearviewDidLoad, maar niet in viewWillAppear — anders kan duplicatie optreden bij elke verschijningVoorbeeld:
class MyViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupViews() setupBindings() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Abonneren op meldingen } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Afmelden van meldingen } deinit { // Opruimen } }
Vraag:
Is het toegestaan voor een view controller om toegang te krijgen tot de eigenschappen van de view buiten de levenscyclus (bijvoorbeeld in de initializer)?
Antwoord:
Nee, tot het moment van aanroep (of overschrijving) van loadView kunnen alle eigenschappen die verband houden met de view niet geïnitialiseerd zijn. Elke toegang daartoe buiten loadView/viewDidLoad leidt tot een crash.
Voorbeeld:
// Fout: self.view is nog niet geïnitialiseerd! init() { super.init(nibName: nil, bundle: nil) self.view.backgroundColor = .red // CRASH }
Verhaal
Het project crashtte door voortijdige toegang tot self.view in init — de view was niet aangemaakt, wat leidde tot een crash.
Verhaal
In grote projecten vergaten ze zich af te melden bij NotificationCenter of delegate in viewWillDisappear en/of deinit, wat leidde tot geheugenlekken (NotificationCenter bleef verwijzen naar de view controller, deze werd niet vrijgegeven en bleef gebeurtenissen afhandelen).
Verhaal
In viewWillAppear werden bij elke verschijning nieuwe subviews aan de view toegevoegd (bijvoorbeeld een laadindicator), zonder het bestaan te controleren. Hierdoor verschenen er steeds meer dubbele indicatoren bij elke terugkeer naar het scherm, wat de UI verstoorde.