2014-09-27 18 views
6

Kök denetleyicinin rolünde basit bir tablo görünümü ile hiyerarşik bir uygulama (NavigationController) var. Herhangi bir hücreyi her seçtiğinizde, ayrıntılarla ilgili bazı bilgileri içeren yeni bir Görünümünüz var (DetailViewController tarafından yönetiliyor). DetailViewController'in görünümünün yanında, Internet'ten veri görüntülemek için bir UIWebView var. Ama sorun bellek kullanımına baktığımda oluyor. UIWebView ile web'den yüklenen içeriğiyle her yeni açılan ViewViewController görünümü, katsayı kullanarak daha fazla bellek getiriyor. Kök denetleyicimin görünümüne geri döndüğümde her şeyi boşaltmak ve bu veriler için ayrılan belleği serbest bırakmak istiyorum.iOS 8 UIWebView bellek yönetimi

Bu sorunu nasıl yönetirim? Bazı belleği kaydetmek için stopLoading: UIWebView'ın örnek yöntemini denedim, ancak bu sorunu da çözmez. ARC çalışma sürecini tam olarak anlayamadığım kadarıyla, her yeni açılan ayrıntı görünümünde katsayı kullanarak normalde daha fazla bellek olması durumunda kendimi garanti edemem.

Teşekkürler!

cevap

9

Dikkat edilmesi gereken birkaç nokta. UIWebView "sızıntı". En azından iOS4'ten beri sızdırıyor. Her büyük sayfa yükü ile, o büyümeye görünüyor ve UIWebView nesnesinin kendisi çıktığında bellek tam olarak doldurulan değil. Bu belleğin bir önbellekte kalmasına ve gerçekten gerektiğinde ya da bir sızıntıda bırakılıp bırakılmadığı, doğru bir şekilde yanıtlayamadım. Bu, yıllar içinde biraz iyileşti, ancak hala Instruments'ın bellek ayırma grafiğini kullanarak görülebilir.

Temel bilgilerden başlayalım. Tasarımınızda değişiklik yapmaya başlamadan önce, tam olarak nelerin sızdığını görmek için Cihazları kullanmayı deneyin. Ayrıca, görüşlerinizi alt sınıflara ayırabilir ve denetleyicileri görüntüleyebilir, dllococ yöntemlerini uygulayabilir ve beklendiklerinde doğru şekilde yayınlandıklarından emin olabilirsiniz. Çoğu zaman, özellikle de bloklar söz konusu olduğunda, insanlar devasa bellek sızıntılarına neden olan koruma döngüleri oluştururlar. Önce bunu yap. İşte

WebKit uğraşarak deneyim birkaç önerileri şunlardır: Mümkün olduğunca

  • Yeniden web görünümü kadar. Yapabilirseniz, aynı nesneyi kullanın ve görüntü denetleyicilerinin görünümlerinin alt görünümü olarak ekleyin.
  • Web görünümünden en fazla boşaltılabilmemiz, UIWebView nesnesini serbest bırakmadan önce boş bir sayfa açtığımızı fark ettik.
  • iOS8, WebKit ile çalışarak yeni bir modeli destekler: WKWebView (WebKit2). Bu modelde, web içeriği yönetilir ve işlem dışı bırakılır ve bu süreçte bellek "sızdırılır". Gerektiğinde, işletim sistemi bu WebKit sürecini öldürecek ve böylece uygulamanızın çalışmasına izin verecektir. Bunu deneyebilir ve iyileştirmelerin olup olmadığını görebilirsiniz.