UIViewController’ın yaşam döngüsü anahtar yöntemleri içerir:
init(nibName:bundle:) / init(coder:): başlatmaloadView: view hiyerarşisinin oluşturulmasıviewDidLoad: view yüklendi (ilk ayarlamalar için ideal yer)viewWillAppear / viewDidAppear: view gösteriliyor/gösterildiviewWillDisappear / viewDidDisappear: view gizleniyor/gizlendideinit: kontrolörün silinmesiYöntemlerin çağrılma sırası:
loadView, ardından viewDidLoad)viewWillAppear/viewWillDisappear, ardından viewDidAppear/viewDidDisappear çağrılırdeinitİncikler:
viewDidLoad içinde view boyutlarına erişmeyin — bu boyutlar güncel olmayabilirdeinit veya viewWillDisappear içinde serbest bırakmak önemlidirviewDidLoad içinde, ancak viewWillAppear içinde değil — aksi takdirde her görüntülemede aynı içerikler tekrar edilebilirÖrnek:
class MyViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupViews() setupBindings() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Bildirimlere abone ol } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Bildirimlerden çık } deinit { // Temizleme } }
Soru:
View controller'ın yaşam döngüsü dışında (örneğin, başlatıcıda) view ile özelliklere erişmesi kabul edilebilir mi?
Cevap:
Hayır, loadView çağrılmadan (veya geçersiz kılınmadan) önce view ile ilişkili tüm özellikler başlatılmamış olabilir. Bu özelliklere loadView/viewDidLoad dışında erişmek çöküşe yol açabilir.
Örnek:
// Hata: self.view henüz başlatılmadı! init() { super.init(nibName: nil, bundle: nil) self.view.backgroundColor = .red //ÇÖKME }
Hikaye
Proje, init içinde self.view'a erken erişim nedeniyle çöküyordu — view oluşturulmamıştı, bu da çökmesine yol açıyordu.
Hikaye
Büyük projelerde viewWillDisappear ve/veya deinit içinde NotificationCenter veya delegate'ten çıkmayı unuttular ve bu da bellek sızıntılarına yol açtı (NotificationCenter view controller'a referans veriyordu ve serbest bırakılmadığı için olaylara devam ediyordu).
Hikaye
viewWillAppear içinde her görüntülemede view'a yeni subview'lar eklendi (örneğin, yükleme göstergesi gösterildi), varlığını kontrol etmeden. Sonuç olarak, ekranda her dönüşte daha fazla kopya yükleme göstergesi belirdi ve UI bozuldu.