2013-03-07 19 views
6

UIWebView önbelleğinin nasıl çalıştığını anlamaya çalışıyorum. UIWebView (en azından mümkün olduğu kadar) tarafından bellek tarafından yönetilen hafızayı süresiz olarak kullanmaktan ve bu nedenle bu yüzden öldürülmekten kaçınmak için hedefim olduğundan beri.Süresiz bellek ayırmak için UIWebView önlenmesi (NSURLCache görünüşte çalışmıyor)

readingotherstackoverflowquestions ve thewebsearching sonra NSURLCache sharedURLCache denemeye karar verdi, ama gerçekten nasıl çalıştığını anlamaya olamaz.

Benim test senaryosu bu birisidir: içimde bir UIWebView ile tek görünümü olduğu

iOS 5için bir test uygulaması hayata geçirdik. Bu UIWebView böyle bir yerel index.html dosyasını yüklemek için gidiyor: Bu index.html dosyasında

// Create an NSString from the local HTML file 
NSString *fullURL = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]; 
NSURL *url = [NSURL fileURLWithPath:fullURL]; 
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
// Load local HTML file 
[self.webView loadRequest:requestObj]; 

, ben yüklenen son görüntülerle Flickr'dan bir JSON indirir bir JS komut dosyası var Onların genel beslemeleri. Her görüntü bir listeye eklenir. Bu işlem, beslemeden indirilen 1000 görüntüye ulaşana kadar, her saniye tekrarlanır.

var nImg = 0; 

function getData() 
{ 
    $.getJSON('http://api.flickr.com/services/feeds/photos_public.gne?format=json&jsoncallback=?', function(data) 
    { 
     var items = []; 
     $.each(data.items, function(i, image) { 
      items.push('<li id="' + image.title + '"><img src="' + image.media.m + '"/></li>'); 
     }); 
     $('#page > #imagesList').append(items.join'')); 
     nImg += items.length; 
    }); 
    $('#page > #numImages').html(nImg); 

    if(nImg < 1000) 
     setTimeout("getData();", 1000); // Get more data in 1s 
} 

$(document).ready(function() 
{ 
    getData(); 
}); 

Son olarak, benim AppDelegate doğrultusunda, bu post yazılı olarak sharedURLCache kurmak: kodunu Bkz

// Initialize the Cache, so we can control the amount of memory it utilizes 
int cacheSizeMemory = 4*1024*1024; // 4MB 
int cacheSizeDisk = 32*1024*1024; // 32MB 
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:nil]; 

[NSURLCache setSharedURLCache:sharedCache]; 

Ama ben aletleri açtığınızda, gerçekleşmesi için ne gerekiyor rağmen ve UIWebView indirilen görüntüleri önbellek için bu sharedURLCache kullanarak olurdu beklediğiniz gibi 4-6MB etrafında düzleştirme yerine, görüntüleri (20MB'a kadar) indirirken bellek devam ederken, tahsisleri kontrol uygulamasını çalıştırın.

Instruments evolution after we reach 1000 images

herkes yanlış ne yapıyorum biliyor mu? Bir şeyi yanlış anlamış mıyım? Sayfayı yanlış mı yüklüyorum? UIWebView, JS'de yüklenen görüntüler için başka bir önbellek kullanıyor mu?

Lütfen bana düşüncelerinizi bildirin. Gerçekten bu sharedURLCache'nin nasıl çalıştığını ve UIWebView'ın URLRequest'i, görüntüleri, ... kullanıldığında nasıl kullandığını anlamak istiyorum. Belleği denetimsiz olarak ayırabilen bir UIWebView kullanan bir Uygulama kullanmak istemiyorum.

cevap

1

Sonunda buna nasıl devam ettiniz? Ben senin *sharedCache initWithMemoryCapacity senin nil olan bir diskPath argüman var dikkat edin. elma Doco itibaren

: iOS yılında

, yol disk önbelleğini saklamak için hangi uygulamanın varsayılan önbellek dizinin bir alt dizini adıdır bu olursa ( alt dizin oluşturulur mevcut değil).

Ödeme önbelleği nasıl kullanılacağına dair Two Bit Labs tarafından bu linki: istekler önce uygulama başlar (zaman önbelleğini yapılandırmak izin paylaşılan önbellek

Öncelikle Yapılandırılması http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

Bu yüzden kullandığımız hafıza miktarını kontrol edebiliriz. senin UIApplicationDelegate olarak:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    int cacheSizeMemory = 4*1024*1024; // 4MB 
    int cacheSizeDisk = 32*1024*1024; // 32MB 
    NSURLCache *sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
... 

üstünde bir 32MB Disk önbelleği ile ilgili bir 4MB bellek önbelleği yapılandırır. Disk önbelleği, “nsurlcache” adlı bir alt dizinde varsayılan iOS önbellek dizininde bulunur.

bellek uyarıları tepki

web görünümlerini kullanabilirsiniz Uygulamalarda gördüğüm çöker en sık nedenidir bir bellek uyarı içinde. Uygulamanız bellek aldığında geldiğinde yeterli belleği boşaltarak için değil atılır ediliyor

Uyarı, hafızayı boşaltmak için paylaşılan önbelleği temizlemelisiniz. senin UIApplicationDelegate bu yapın:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 
    [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
} 

Şimdi profilcisine uygulamanızı çalıştırdığınızda, bellek kullanımı doğrulmak görmelisiniz ve simülatörde bir bellek uyarıyı tetikleyen eğer bellek kullanımı damla görmelisiniz.

+0

Cevabınız için teşekkürler! Sorunun ne olduğunu ve alıntı yaptığınız bağlantının, bu testi yapmak için izlediğim ile aynı olduğunu anlamadım (bu soruyu sorduğumda görebilirsiniz): $ – veducm