Очистка кеша UIWebview - PullRequest
66 голосов
/ 29 марта 2011

Я использовал UIWebview для загрузки веб-страницы, используя метод loadRequest:, когда я покидаю эту сцену, я вызываю [self.webView stopLoading]; и освобождаю webView.

В мониторе активности при первом запуске я увидел, что реальная память увеличилась на 4 МБ, а при многократных запусках / загрузке реальная память не увеличивается. Увеличивается только один раз.

Я проверил количество сохраненных веб-просмотров. Это правильно, т. Е. 0. Я думаю, что UIWebView кеширует некоторые данные. Как избежать кэширования или удалить кэшированные данные? Или есть другая причина для этого?

Ответы [ 9 ]

124 голосов
/ 09 апреля 2011

Я действительно думаю, что она может сохранить кэшированную информацию, когда вы закрываете 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)
    }
}
45 голосов
/ 31 января 2012

Не отключайте кэширование полностью, это снизит производительность вашего приложения и не будет необходимости. Важным моментом является явная настройка кэша при запуске приложения и его очистка при необходимости.

Таким образом, в 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/

9 голосов
/ 25 апреля 2011

Вы можете отключить кэширование, выполнив следующие действия:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
6 голосов
/ 23 ноября 2016

Свифт 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)
    }
}
2 голосов
/ 31 марта 2016

Я не мог изменить код, поэтому мне понадобилась командная строка для целей тестирования, и я подумал, что это может кому-то помочь:

Кэши для конкретных приложений хранятся в ~/Library/Caches/<bundle-identifier-of-your-app>, поэтому просто удалите, как показано ниже, и снова откройтеВаша заявка

rm -rf ~/Library/Caches/com.mycompany.appname/

2 голосов
/ 31 марта 2011

Мое обоснованное предположение состоит в том, что используемая вами память используется не из содержимого страницы, а из загрузки UIWebView и всех его библиотек, поддерживающих WebKit. Мне нравится элемент управления UIWebView, но это «тяжелый» элемент управления, который извлекает очень большой блок кода.

Этот код является большим подмножеством браузера iOS Safari и, вероятно, инициализирует большой массив статических структур.

1 голос
/ 28 января 2016

Для 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)
1 голос
/ 13 декабря 2014

После различных попыток только это хорошо работает для меня (под ios 8):

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
0 голосов
/ 08 ноября 2012

Я загружаю 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.

Обновление1: Я нашел это .
Изменение html-файлов, хотя и выглядит очень грязно.

...