Очистка кэша UIWebview
я использовал UIWebview для загрузки веб-страницы с помощью loadRequest: метод, когда я покидаю эту сцену, я называю [self.webView stopLoading]; и отпустите webView.
в мониторе активности при первом запуске я видел, что реальная память увеличилась на 4 МБ, а при нескольких запусках/загрузке реальная память не увеличивается. Он увеличивается только один раз.
Я проверил сохранить количество webview. Это правильно, т. е. 0. Я думаю, что UIWebView кэширует некоторые данные. Как избежать кэширования или удалить кэшированные данные? Или есть другая причина для этого?
9 ответов:
я на самом деле думаю, что он может сохранять кэшированную информацию, когда вы закрываете
UIWebView. Я пробовал удалитьUIWebViewот меняUIViewController, выпуская его, а затем создавая новый. Новый точно помнил, где я был, когда я вернулся по адресу, не перезагружая все (он помнил мой предыдущийUIWebViewвошел в систему).Итак, несколько предложений:
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];это приведет к удалению кэшированного ответа для конкретного запроса. Существует также вызов, который удалит все кэшированные ответы для всех запросов, выполненных на
UIWebView:[[NSURLCache sharedURLCache] removeAllCachedResponses];после этого, вы можете попробовать удалить любые связанные куки с
UIWebView:for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { if([[cookie domain] isEqualToString:someNSStringUrlDomain]) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; } }Swift 3:
// Remove all cache URLCache.shared.removeAllCachedResponses() // Delete any associated cookies if let cookies = HTTPCookieStorage.shared.cookies { for cookie in cookies { HTTPCookieStorage.shared.deleteCookie(cookie) } }
не отключайте кэширование полностью, это повредит производительность вашего приложения, и это не нужно. Важно четко настроить кэш при запуске приложения и очистить его при необходимости.
так
application:DidFinishLaunchingWithOptions:настроить ограничения кэша следующим образом:- (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"]; [NSURLCache setSharedURLCache:sharedCache]; // ... other launching code }после того, как вы его правильно настроить, тогда, когда вам нужно очистить кэш (например,
applicationDidReceiveMemoryWarningили когда вы закрываетеUIWebView) просто делать:[[NSURLCache sharedURLCache] removeAllCachedResponses];и вы увидите памяти восстановленный. Я написал об этой проблеме здесь: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/
вы можете отключить кэширование следующим образом:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release];
Swift 3.
// Remove all cache URLCache.shared.removeAllCachedResponses() // Delete any associated cookies if let cookies = HTTPCookieStorage.shared.cookies { for cookie in cookies { HTTPCookieStorage.shared.deleteCookie(cookie) } }
мое образованное предположение заключается в том, что использование памяти, которое вы видите, не связано с содержимым страницы, а скорее с загрузкой UIWebView и все это поддерживает библиотеки WebKit. Мне нравится элемент управления UIWebView, но это "тяжелый" элемент управления, который тянет очень большой блок кода.
этот код является большим подмножеством браузера iOS Safari и, вероятно, инициализирует большое количество статических структур.
Я не мог изменить код, поэтому мне нужна была командная строка для тестирования и решил, что это может помочь кому-то:
конкретные кэши приложений хранятся в
~/Library/Caches/<bundle-identifier-of-your-app>, Так что просто удалите, как показано ниже, и снова откройте приложение
rm -rf ~/Library/Caches/com.mycompany.appname/
после различных попыток, только это хорошо работает для меня (под ios 8):
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil]; [NSURLCache setSharedURLCache:cache];
для swift 2.0:
let cacheSizeMemory = 4*1024*1024; // 4MB let cacheSizeDisk = 32*1024*1024; // 32MB let sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache") NSURLCache.setSharedURLCache(sharedCache)
я загружаю html-страницы из документов, и если они имеют то же имя css-файла
UIWebViewкажется, он не бросает предыдущие правила css. Может быть, потому что у них один и тот же URL или что-то в этом роде.Я попытался это:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release];Я попытался это :
[[NSURLCache sharedURLCache] removeAllCachedResponses];я загружаю начальную страницу с:
NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];он отказывается выбрасывать свои кэшированные данные! Разочарование!
Я делаю это внутри приложения PhoneGap (Cordova). У меня есть не пробовал его в изолированном UIWebView.
Update1: я нашел этой.
Изменение html-файлов, хотя и кажется очень грязным.
Comments