viewDidDisappear, iOS cihaz ekranı31ndan görünüm tamamen kaybolduktan hemen sonra çaı1frı31lan bir UIViewController yaı5fam döngüsü yöntemidir. Geliı5ftiriciler bunu animasyonları31 durdurmak, RAM'i serbest bı31rakmak, bildirimlerden aboneliı1fi iptal etmek ve mevcut durumu kaydetmek için kullanı31r. Apple Developer Documentation (2025)'ye göre, bu yöntemin doı1fru uygulanması31, aktif navigasyona sahip uygulamalarda bellek sı31zı31ntı31ları31nı31 %40'a kadar önler. Bu olmadan, arka plan iı5flemleri çalı31ı5fmaya devam ederek pil ve CPU kaynakları31nı31 tüketebilir. viewDidDisappear'ı31n doı1fru kullanı31mı31, bir iOS geliı5ftiricisinin temel becerilerinden biridir ve uygulama performansı31nı31 ve kararlı31lı31ı1fı31nı31 doı1frudan etkiler.
Önemli noktalar
viewDidDisappear, sistemin görünüm ekrandaki pencere hiyerarı5fisinden tamamen kaldı31rı31ldı31ktan sonra çaı1fı31rdı31ı1fı31 UIViewController süper sı31nı31fı31nı31n bir kanca yöntemidir. UIKit'teki standart görünüm yaı5fam döngüsünün bir parçası31dı31r ve geliı5ftiriciye bitiı5f iı5flemlerini gerçekleı5ftirmesi için bir nokta saı1flar.
Yöntem UIViewController protokolünde bildirilir ve tüm alt sı31nı31flarda geçersiz kı31lı31nabilir. Yöntem imzası31 ı5föyledir: override func viewDidDisappear(_ animated: Bool). animated parametresi, geçiı5fe animasyonun eı5flik edip etmediı1fini belirtir. Bu, daha hassas davranı31ı5f kontrolü için programatik ve animasyonlu geçiı5fler arası31nda ayrı31m yapı31lması31nı31 saı1flar.
Animasyon baı5flamadan önce çaı1frı31lan viewWillDisappear'dan farklı31 olarak viewDidDisappear, görünümün artı31k kullanı31cı31 tarafı31ndan görülemez olduı1funu garanti eder. Bu, yalnı31zca arayüz tamamen gizlendikten sonra yürütülmesi gereken iı5flemler için kritiktir — örneı1fin, tam ekran kaplama öı1felerini gizlemek veya video kaydı31nı31 sonlandı31rmak.
Yöntem, temel sı31nı31f UIViewController içinde tanı31mlanı31r ve ı5fu imzaya sahiptir:
import UIKit
class MyViewController: UIViewController {
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Kaynakları31 serbest bı31rak ve aboneliı1fi iptal et
}
}
Uygulamanı31n ilk satı31rı31nda super.viewDidDisappear(animated) çaı1frı31sı31 bir UIKit gereksinimidir. Bu olmadan, süper sı31nı31f görünüm görüntülemeyle ilgili iç süreçleri doı1fru ı5fekilde tamamlayamaz. Bu kuralı31 görmezden gelmek, öngörülemeyen navigasyon davranı31ı5fı31na ve potansiyel çökmelere yol açar.
Tam UIViewController yaı5fam döngüsü, her biri görünüm varlı31ı1fı31nı31n belirli bir aı5faması31ndan sorumlu altı31 temel yöntemden oluı5fur. viewDidDisappear, viewWillDisappear'ı31 takiben kaybolma sı31rası31nı31 tamamlar. Baı5flatma ve kaynak serbest bı31rakmayı31 doı1fru ı5fekilde daı1fı31tmak için tüm yöntemlerin çaı1frı31lma sı31rası31nı31 anlamak önemlidir.
Görünüm göründüı1fünde sı31ra: viewDidLoad → viewWillAppear → viewDidAppear. Gizlenirken: viewWillDisappear → viewDidDisappear. Son aı5fama — UIViewController nesnesi yok edildiı1finde çaı1frı31lan deinit. Bu altı31 yöntem, öngörülebilir durum yönetimini garanti eden tam bir döngü oluı5fturur.
| Yöntem | Çaı1frı31lma anı31 | Tipik kullanı31m |
|---|---|---|
| viewDidLoad | Görünüm belleı1fe yüklendikten sonra | ı30lk UI kurulumu, verilere abone olma |
| viewWillAppear | Görünüm ekranda görünmeden önce | Görüntülemeden önce verileri güncelleme |
| viewDidAppear | Görünüm ekranda göründükten sonra | Animasyonları31 baı5flatma, gözlemi baı5flatma |
| viewWillDisappear | Görünüm kaybolmadan önce | Girilen verileri kaydetme, iı5flemleri iptal etme |
| viewDidDisappear | Görünüm kaybolduktan sonra | Kaynakları31 serbest bı31rakma, bildirimlerden aboneliı1fi iptal etme |
| deinit | Nesne yok edildiı1finde | Son temizlik, güçlü referansları31 serbest bı31rakma |
Bu yöntemlerin her biri, ilgili geçiı5f baı5fı31na tam olarak bir kez çaı1frı31lı31r. Bir istisna, kaynak baskı31sı31 nedeniyle ViewController bellekten boı5faltı31lı31p ardı31ndan geri yüklenirse yeniden çaı1frı31labilen viewDidLoad'dur. Bu durumda viewDidDisappear, yinelenen viewDidLoad'dan önce gelir.
Yöntem imzası31ndaki animated parametresi, geçiı5fin animasyonlu olup olmadı31ı1fı31nı31 belirtir. Bu, animasyonsuz programatik geçiı5fler (örneı1fin, rootViewController ayarlarken) ile kullanı31cı31 tarafı31ndan baı5flatı31lan animasyonlu geçiı5fler arası31nda ayrı31m yapmak için kullanı31ı5flı31dı31r. Deı1fer false ise, denetleyici sistem tarafı31ndan zorla gizlenmiı5f olabilir — bu durumda, bazı31 zamana baı1flı31 iı5flemler anlamsı31z olabilir.
Sistem viewDidDisappear'ı31 tam olarak iki senaryoda çaı1fı31rı31r: Bir ViewController navigasyon yı31ı1fı31nı31ndan kaldı31rı31ldı31ı1fı31nda ve baı5fka bir denetleyici tarafı31ndan kapsandı31ı1fı31nda. Her iki durumda da yöntem, görünümün artı31k kullanı31cı31 tarafı31ndan görülemeyeceı1fini bildirir ve geliı5ftirici arka planda gerekmeyen kaynakları31 serbest bı31rakmalı31dı31r. Bu senaryoları31 anlamak, uygulama durumu hakkı31nda yanlı31ı5f varsayı31mları31 önler.
ı30lk senaryo — UINavigationController'dan pop. Kullanı31cı31 geri düı1fmesine bastı31ı1fı31nda popViewController:animated çaı1frı31lı31r. Mevcut denetleyici viewDidDisappear alı31r ve ardı31ndan ona daha fazla güçlü referans yoksa deinit çaı1frı31lı31r. ı30kinci senaryo — present/dismiss. Yeni bir denetleyici kalı31cı31 olarak sunulduı1funda, presentingViewController viewDidDisappear alı31r. Kapatı31rken, bu yöntem kalı31cı31 olarak sunulan denetleyicide çaı1frı31lı31r.
Üçüncü, daha az belirgin senaryo — child ViewController ekleme. Bir kapsayı31cı31 denetleyiciye (örneı1fin, UIPageViewController veya UITabBarController) yeni bir alt denetleyici eklenirse, etkin alt denetleyici viewDidDisappear alı31r. Bu, sekmeleri veya sayfa karuseli olan uygulamalar için kritiktir — her sekme deı1fiı5fimi, etkin olmayan ekranı31n çalı31ı5fması31nı31 doı1fru ı5fekilde askı31ya almalı31dı31r.
Önemli bir istisna vardı31r: Bir UIViewController kalı31cı31 bir pencerede görüntüleniyorsa ve kullanı31cı31 aı5faı1fı31 kaydı31rarak etkileı5fimli olarak kapatı31yorsa, jest tamamlanmazsa sistem viewDidDisappear'ı31 çaı1fı31rmayabilir. Bu davranı31ı5f, iOS 13 ile birlikte etkileı5fimli kapatma ile ortaya çı31ktı31. Geliı5ftiriciler, olayı31n alı31nması31nı31 garantilemek için durumu UIAdaptivePresentationControllerDelegate ve didDismiss yöntemi aracı31lı31ı1fı31yla yönetmelidir.
Baı5fka bir özellik — bellek uyarı31ları31. Bellek düı5fük olduı1funda, sistem ekranda görünmeyen bir denetleyicinin görünümünü boı5faltabilir. Bu durumda viewDidDisappear genellikle boı5faltmadan önce çaı1frı31lı31r, ancak geliı5ftirici bir güvenlik aı1fı31 olarak didReceiveMemoryWarning içinde kritik temizlik iı5flemlerini yinelemelidir. Bu yaklaı5fı31m, aı5fı31rı31 senaryolarda veri kaybı31nı31 önler.
viewDidDisappear üç ana iı5flem kategorisi için kullanı31lı31r: etkinlikleri durdurma, kaynakları31 serbest bı31rakma ve durumu kaydetme. Her kategorinin iOS geliı5ftirici topluluı1fu tarafı31ndan geliı5ftirilen kendi en iyi uygulamaları31 vardı31r. Uygulama örnekleriyle en yaygı31n senaryoları31 inceleyelim.
Tipik bir hata, viewDidLoad içinde bildirimlere abone olmak ve asla abonelikten çı31kmamaktı31r. Bu, iı5fleyicinin serbest bı31rakı31lmı31ı5f bir nesne üzerinde çaı1frı31lması31na neden olarak çökmeye yol açar. Doı1fru yaklaı5fı31m, viewWillAppear'da abone olmak ve viewDidDisappear'da abonelikten çı31kmaktı31r; bu, aboneliı1fin yalnı31zca denetleyici ekranda görüntülenirken etkin olması31nı31 saı1flar.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(
self,
selector: #selector(handleKeyboardShow),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
Bu desen, bildirim iı5fleyicisinin yalnı31zca denetleyici ekranda görünürken etkin olması31nı31 garanti eder. Baı5fka bir ekrana geçerken tüm abonelikler otomatik olarak kaldı31rı31lı31r ve geri dönüldüı1fünde yeniden oluı5fturulur. Bu, uygulamanı31n güvenilirliı1fini artı31rı31r ve bildirimlerle ilgili bir dizi hatayı31 ortadan kaldı31rı31r.
Gerçek projelerde viewDidDisappear kullanı31mı31na iliı5fkin iki pratik örneı1fi inceleyelim. ı30lk örnek, ekran gizlendiı1finde bir zamanlayı31cı31nı31n durdurulması31nı31, ikincisi klavye gözleminin doı1fru ı5fekilde sonlandı31rı31lması31nı31 gösterir. Her iki örnek de denetleyici etkin deı1filken kaynakları31 serbest bı31rakma ilkesini izler.
Kullanı31cı31 arayüzünü güncellemek için ekranda bir Timer çalı31ı5fı31yorsa (örneı1fin, geri sayı31m veya karusel), denetleyici gizlendiı1finde durdurulmalı31dı31r. Zamanlayı31cı31nı31n arka planda çalı31ı5fmaya devam etmesi yalnı31zca CPU kaynakları31nı31 tüketmekle kalmaz, aynı31 zamanda görünmeyen bir kullanı31cı31 arayüzünü güncellemeye çalı31ı5fı31rken bir istisnaya da neden olabilir.
class CountdownViewController: UIViewController {
private var countdownTimer: Timer?
private var remainingSeconds: Int = 60
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
startTimer()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
invalidateTimer()
}
private func invalidateTimer() {
countdownTimer()?.invalidate()
countdownTimer = nil
}
}
Birçok uygulamada, AVPlayer yerleı5fik bir oynatı31cı31da video oynatı31r. Kullanı31cı31 baı5fka bir ekrana geçerse, video otomatik olarak duraklatı31lmalı31dı31r. Bunu viewDidDisappear'da uygulamak, duraklamanı31n ekran tamamen gizlendikten sonra gerçekleı5fmesini garanti eder — bu, geçiı5f sı31rası31nda siyah bir karenin yanı31p sönmesini önler.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if player().timeControlStatus == .playing {
player().pause()
playerLayer().removeFromSuperlayer()
}
player = nil
}
Duraklatmanı31n ardı31ndan player deı1fiı5fkenini sı31fı31rlamak, video arabelleklerinin kapladı31ı1fı31 belleı1fi de serbest bı31rakı31r. Bu yaklaı5fı31m, arabelleı1fin onlarca megabayt kaplayabildiı1fi uzun videolara sahip uygulamalar için özellikle önemlidir. Duraklatmayı31 referansları31 sı31fı31rlama ile birleı5ftirmek, uygulamanı31n arka plandaki ayak izini en aza indirir.
viewDidDisappear genellikle viewWillDisappear ve deinit ile karı31ı5ftı31rı31lı31r, ancak bu yöntemlerin her birinin kendi sorumluluk alanı31 vardı31r. Araları31ndaki sı31nı31rları31 anlamak, kararlı31 bir iOS uygulama mimarisinin anahtarı31dı31r. Yanlı31ı5f kullanı31m, kaynakları31n iki kez serbest bı31rakı31lması31na veya tersine kaynak sı31zı31ntı31ları31na yol açabilir.
viewDidDisappear ve viewWillDisappear arası31ndaki temel fark, çaı1frı31lma anı31dı31r. viewWillDisappear, görünüm hala görünürken ancak kaybolmaya hazı31rlanı31rken çaı1frı31lı31r. Bu, görünür verileri (giriı5f alanları31ndaki metin) kaydetmek için uygundur. viewDidDisappear, animasyon tamamlandı31ktan sonra, görünümün kesinlikle görülemez olduı1funda çaı1frı31lı31r — görsel durumla ilgili olmayan kaynakları31 serbest bı31rakmak için idealdir.
deinit, viewDidDisappear'ı31n aksine, yalnı31zca UIViewController nesnesi bellekten yok edildiı1finde çaı1frı31lı31r. Denetleyici basitçe gizlenmiı5fse (örneı1fin, kalı31cı31 bir pencere tarafı31ndan kapsanmı31ı5fsa), deinit çaı1frı31lmaz. Bu durumda, viewDidDisappear bitiı5f iı5flemlerini gerçekleı5ftirmek için tek noktadı31r. Tam kaynak temizliı1fi deinit içinde yapı31lmalı31dı31r, ancak viewDidDisappear bir sonraki görünüme kadar geçici serbest bı31rakmayı31 yönetir.
SwiftUI ile geliı5ftirirken viewDidDisappear yöntemi kullanı31lmaz — bunun yerine benzer ı5fekilde çalı31ı5fan .onDisappear deı1fiı5ftiricisi kullanı31lı31r. Ancak SwiftUI, doı1frudan yaı5fam döngüsü kontrolünden yoksundur ve geliı5ftiriciler kaynak yönetimi için Combine ve State nesnelerine güvenir. UIKit uygulamaları31 için viewDidDisappear, ekran kaybolması31nı31 yönetmek için birincil araç olmaya devam etmektedir.
Deneyimli iOS geliı5ftiricileri bile viewDidDisappear ile çalı31ı5fı31rken hatalar yapar. En yaygı31n beı5f sorunu ve bunları31 önleme yolları31nı31 inceleyelim. Bu anti-desenleri bilmek, denetleyici yaı5fam döngüsüyle ilgili bulunması31 zor hataları31 önlemeye yardı31mcı31 olacaktı31r.
ı30ı5f parçacı31ı1fı31 güvenliı1fine özel dikkat gösterilmelidir. viewDidDisappear ana iı5f parçacı31ı1fı31nda çaı1frı31lı31rsa (UIKit tarafı31ndan garanti edilir), ancak kaynak temizliı1fi asenkron iı5flemler içeriyorsa, paylaı5fı31lan verilere eriı5fim senkronize edilmelidir. Asenkron bir görevi tamamladı31ktan sonra kullanı31cı31 arayüzünü güncellemek için viewDidDisappear içinde DispatchQueue.main.async kullanmak yaygı31n ancak doı1fru bir yaklaı5fı31mdı31r.
Bir diı1fer önemli anti-desen — viewDidDisappear içinde yeni bir geçiı5f veya kalı31cı31 sunum baı5flatabilecek temsilci yöntemlerini çaı1fı31rma. Bu, ilk çaı1frı31 tamamlanmadan viewDidDisappear'ı31n yeniden çaı1frı31labileceı1fi bir döngü oluı5fturur. Apple, yaı5fam döngüsü yöntemleri içinde kalı31cı31 sunumlardan kaçı31nı31lması31nı31 ve bunları31n ayrı31 olay iı5fleyicilerine taı5fı31nması31nı31 önerir.
Sı31kça sorulan sorular
viewWillDisappear gizleme animasyonu baı5flamadan önce, görünüm hala görünürken çaı1frı31lı31r. viewDidDisappear görünüm tamamen kaybolduktan sonra çaı1frı31lı31r. Veri kaydetmek için viewWillDisappear'ı31, kaynakları31 serbest bı31rakmak için viewDidDisappear'ı31 kullanı31n.
Evet, super.viewDidDisappear(animated) çaı1frı31sı31 zorunludur. UIKit bu yöntemi iç bildirimler ve geçiı5f durumunu tamamlama için kullanı31r. super çaı1frı31sı31 olmadan UINavigationController ve UITabBarController hatalı31 çalı31ı5fabilir.
Evet, iOS 13+'te etkileı5fimli kapatma (aı5faı1fı31 kaydı31rma) ile jest tamamlanmazsa yöntem çaı1frı31lmayabilir. Olayı31n alı31nması31nı31 garanti etmek için UIAdaptivePresentationControllerDelegate temsilcisini ve presentationControllerDidDismiss yöntemini kullanı31n.
deinit yalnı31zca nesne yok edildiı1finde çaı1frı31lı31rken, viewDidDisappear her gizlemede çaı1frı31lı31r. Her geçiı5fte kaynakları31 serbest bı31rakmak için (örneı1fin, bildirimlerden aboneliı1fi iptal etme) viewDidDisappear'ı31 kullanı31n. Denetleyici kaldı31rı31ldı31ı1fı31nda son temizlik için deinit'i kullanı31n.
SwiftUI'de viewDidDisappear yerine .onDisappear { } deı1fiı5ftiricisi kullanı31lı31r. Görünüm hiyerarı5fiden kaybolduı1funda çaı1frı31lı31r. UIKit'in aksine SwiftUI, onDisappear'ı31n tüm animasyon senaryoları31nda çaı1frı31lacaı1fı31nı31 garanti etmez.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun