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

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

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

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

66 голосов | спросил Chandan Shetty SP 29 MaramTue, 29 Mar 2011 10:08:01 +04002011-03-29T10:08:01+04:0010 2011, 10:08:01

9 ответов


0

Я действительно думаю, что он может сохранить кэшированную информацию, когда вы закроете 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)
    }
}
ответил groomsy 9 PMpSat, 09 Apr 2011 21:42:57 +040042Saturday 2011, 21:42:57
0

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

Поэтому в 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 или когда вы закрываете ---- +: = 3 =: + ----) просто выполните:

UIWebView

и вы увидите, что память восстановлена. Я написал в блоге об этой проблеме здесь: http://twobitlabs.com/2012/01 /КСН-IPAD-iphone-nsurlcache-UIWebView-памяти использования /

ответил ToddH 31 Jam1000000amTue, 31 Jan 2012 04:07:05 +040012 2012, 04:07:05
0

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

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
ответил InsertWittyName 25 PMpMon, 25 Apr 2011 20:56:29 +040056Monday 2011, 20:56:29
0

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)
    }
}
ответил CodeOverRide 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 23:53:44 +0300 2016, 23:53:44
0

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

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

ответил Chris Hawkins 31 MarpmThu, 31 Mar 2011 14:36:44 +04002011-03-31T14:36:44+04:0002 2011, 14:36:44
0

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

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

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

ответил PnotNP 31 MaramThu, 31 Mar 2016 01:06:34 +03002016-03-31T01:06:34+03:0001 2016, 01:06:34
0

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

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
ответил Blasco73 13 SatEurope/Moscow2014-12-13T18:36:56+03:00Europe/Moscow12bEurope/MoscowSat, 13 Dec 2014 18:36:56 +0300 2014, 18:36:56
0

Для 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)
ответил sebspi 28 Jpm1000000pmThu, 28 Jan 2016 18:42:03 +030016 2016, 18:42:03
0

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

ответил Evgeni Petrov 8 42012vEurope/Moscow11bEurope/MoscowThu, 08 Nov 2012 21:34:45 +0400 2012, 21:34:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132