Очистка кеша UIWebview

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

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

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

Ответ 1

Я действительно думаю, что он может сохранить кешированную информацию, когда вы закрываете UIWebView. Я попытался удалить UIWebView из моего UIViewController, выпустив его, а затем создав новый. Новый помнил, где я был, когда возвращался к адресу, не перезагружая все (он помнил, что мой предыдущий UIWebView был зарегистрирован).

Итак, несколько предложений:

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

Это приведет к удалению кэшированного ответа для конкретного запроса. Существует также вызов, который удалит все кэшированные ответы для всех запросов, запущенных на UIWebView:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

После этого вы можете попробовать удалить все связанные файлы cookie с помощью 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)
    }
}

Ответ 2

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

Итак, в 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/

Ответ 3

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

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

Ответ 4

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)
    }
}

Ответ 5

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

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

Ответ 6

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

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];

Ответ 7

Для быстрого 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)

Ответ 8

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

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

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

Ответ 9

Я загружаю html-страницы из Documents и, если они имеют одно и то же имя 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 файлов, хотя кажется очень грязным.