ViewDidLoad ve viewDidAppear arasındaki fark


86

Arasındaki fark nedir viewDidLoadve viewDidAppear? Bu işlevlere ne tür bir başlatma veya özel kod giriyor?

örneğin, presentModalViewControlleryalnızca içinde bulunduğunda viewDidAppearve açık olmadığında çalışır viewDidLoad.


Yanıtlar:


148

viewDidLoadgörüntüleme denetleyicisi belleğe ilk yüklendiğinde tam olarak bir kez çağrılır. Bu, herhangi bir örnek değişkenini somutlaştırmak ve bu görünüm denetleyicisinin tüm yaşam döngüsü boyunca canlı olan herhangi bir görünümü oluşturmak istediğiniz yerdir. Ancak, görüş genellikle bu noktada henüz görünmez.

viewDidAppeargörünüm gerçekte görünür olduğunda çağrılır ve bir Görünüm Denetleyicisinin yaşam döngüsü boyunca birden çok kez çağrılabilir (örneğin, bir Modal Görünüm Denetleyicisi kapatıldığında ve görünüm yeniden görünür hale geldiğinde). Bu, herhangi bir düzen eylemini gerçekleştirmek veya UI'de herhangi bir çizim yapmak istediğiniz yerdir - örneğin, bir modal görünüm denetleyicisi sunmak. Ancak, burada yaptığınız her şey tekrarlanabilir olmalıdır. Bir şeyleri burada tutmamak en iyisidir, yoksa görünüm kaybolduğunda serbest bırakmazsanız bellek sızıntıları yaşarsınız.

Bakınız: https://developer.apple.com/documentation/uikit/uiviewcontroller


15
Sen ve WrightsCS kesinlikle haklısınız. Ancak, saçları bölmek için değil viewDidLoad, genellikle yalnızca bir kez ve yalnızca bir kez çağrılırken, tekrar çağrılabileceği bir durum vardır. Spesifik olarak, bir alırsanız didReceiveMemoryWarning, görünmeyen görünümleriniz serbest bırakılabilir (görünüm denetleyicilerine dokunulmasa da) ve geri döndüğünüzde viewDidLoadbunlar için tekrar çağrılabilir.
Rob

1
Ben her zaman ve otomatik olarak (kontrolör kendisi olduğunu sizin için serbest bırakılması görünüm denetleyicisi Ivars hakkında yorum katılıyorum emin değilim değil yayınlandı). Sanırım ikimizin de kolayca bir viewDidLoad oluşturup bir didReceiveMemoryWarning. Ancak, yazarken iyi uygulamalar kullanırsanız, iyi viewDidLoadolmanız gerektiğini kabul ediyorum . Tek noktam, ivarların özensiz kullanımı ve manuel bellek yönetiminin kesinlikle sızıntılara neden olabileceği viewDidLoad. İnsanlar didReceiveMemoryWarningsenaryoya duyarlı olmalı ve buna göre program yapmalıdır .
Rob

2
Konuya değinmek istemem ama bu alışverişten 24 saat sonra, başka bir soruyu yanıtlarken , tam olarak viewDidLoadüzerine sızacak türden bir kod örneği buldum didReceiveMemoryWarning. İç çekmek.
Rob

1
Bu yanıt, diğeriyle doğrudan çelişiyor: stackoverflow.com/a/3411636/269753 , bellek uyarılarını hiç almadığım zamanlarda bile, viewDidLoad yöntemimin birden fazla kez çağrıldığını gözlemliyorum. Açıklığa kavuşturmak isteyen var mı?
Ricardo Sanchez-Saez

2
Bir çelişki olduğunu görmüyorum. Bu soru, viewDidAppear ile değil, viewDidLoad ve viewDidUnload arasındaki ilişkiyle ilgilidir.
davidgoli

21

Basitçe söylemek gerekirse, içinde viewDidLoadolduğu gibi viewDidAppearbu kontrolleri veya dizileri yenilemek istediğiniz yerde herhangi bir kontrol veya dizi oluşturmak istersiniz.

viewDidLoaddenetleyici oluşturulduğunda bir kez viewDidAppearçağrılır ve görünüm her defasında, DID göründüğünde çağrılır. Diyelim ki sunduğunuz modal bir görüşünüz var, bu görüş reddedildiğinde viewDidAppearçağrılacak ve viewDidLoadçağrılmayacak.


3
İlk paragraf güzelce yazılmış bir ipucu. Ancak ikinci paragraf yanlış. viewDidLoadedilebilir bir defadan fazla adlandırılan . Görünümünüz görüntülenmediğinde (diğer görünümler yığını altında) düşük bellek durumunda iOS'un eski sürümleri tarafından kaldırılırsa, görünüm denetleyicisi ekranda yeniden görüntülenmesi gerektiğinde görünümü otomatik olarak yeniden yükleyecektir. İOS'un sonraki sürümlerinde, iOS'un sizin için daha önce yaptığı şeyi yaparak bellek kullanımını azaltmaya yardımcı olmayı seçebilirsiniz: didReceiveMemoryWarningMesaj geldiğinde ekran dışı görünümleri kaldırın, bu durumda viewDidLoadtekrar çağrılacaktır.
Basil Bourque

@WrightsCS Bunu söyleyen herhangi bir resmi apple belgeniz var mı? "viewDidLoad, denetleyici oluşturulduğunda bir kez çağrılır" Çünkü geçmişte hatırladığım kadarıylaDidLoad, düşük bellek senaryolarında birkaç kez çağrılabilirdi. Çok teşekkürler.
Ricardo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.