ProgramlamaiOS geliştirici

UIKit'teki view controller yaşam döngüsünü tanımlayın ve yaşam döngüsüyle yanlış etkileşimlerin bellek sızıntılarına veya UI hatalarına nasıl yol açabileceğini açıklayın. Bilinmesi gereken incelikler nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

UIViewController’ın yaşam döngüsü anahtar yöntemleri içerir:

  • init(nibName:bundle:) / init(coder:): başlatma
  • loadView: view hiyerarşisinin oluşturulması
  • viewDidLoad: view yüklendi (ilk ayarlamalar için ideal yer)
  • viewWillAppear / viewDidAppear: view gösteriliyor/gösterildi
  • viewWillDisappear / viewDidDisappear: view gizleniyor/gizlendi
  • deinit: kontrolörün silinmesi

Yöntemlerin çağrılma sırası:

  • Önce view hiyerarşisi oluşturulur (loadView, ardından viewDidLoad)
  • Her ekranda görünme ve gizlenme sırasında viewWillAppear/viewWillDisappear, ardından viewDidAppear/viewDidDisappear çağrılır
  • Silinmeden sonra — deinit

İncikler:

  • viewDidLoad içinde view boyutlarına erişmeyin — bu boyutlar güncel olmayabilir
  • Kaynakları (gözlemciler, zamanlayıcılar) deinit veya viewWillDisappear içinde serbest bırakmak önemlidir
  • Subview eklemek — viewDidLoad 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 } }

Aldatıcı Soru

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 }

İlgili Bilgilerin Bilinmemesinden Kaynaklanan Gerçek Hata Örnekleri


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.