清除UIWebview缓存


68

我使用UIWebview来使用loadRequest:方法加载网页,当我离开该场景时,我调用[self.webView stopLoading];并释放了webView。

在第一次启动的活动监视器中,我看到实际内存增加了4MB,并且在多次启动/加载时,实际内存没有增加。它仅增加一次。

我已经检查了webview的保留计数。这是正确的,即0。我认为UIWebView正在缓存一些数据。如何避免缓存或删除缓存的数据?还是有其他原因?

Answers:


127

我实际上认为,当您关闭时,它可能会保留缓存的信息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];
    }
}

斯威夫特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)
    }
}

那么loadHTMLString:baseURL:呢?当我删除Cookie和URL缓存时,它似乎不起作用...
nverinaud

9
嗨,我尝试过[[NSURLCache sharedURLCache] removeAllCachedResponses] ;,但是它不起作用,我在缓存中仍然有相同的图像...是否有其他解决方法?
阿尔格2013年

3
是的,在这里,我正在获得永久性登录,并且我认为UIWebView持有令牌的时间可能太长。有什么想法吗?
伊桑·帕克

1
这在iOS 7中有效吗,因为在过去的几天里,我仍然遇到相同的问题,我使用了上面的代码,但是没有任何反应,但是我仍然在Webview中看到缓存的页面。关于此@groomsy的任何建议
user2538944 2014年

1
清除NSURLCache并不能帮助我使用iOS7,但是我有一个涉及NSURLProtocol的解决方法。stackoverflow.com/a/26408420/449161
Ben Flynn 2014年

45

不要完全禁用缓存,这会损害您的应用性能,这是不必要的。重要的是在应用启动时显式配置缓存,并在必要时清除它。

因此在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/


如果可以的话,还有更多优点。我认为这可以提高性能并解决了我过度激进的缓存问题。
Erik Reppen '16

10

您可以通过执行以下操作禁用缓存:

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

弧:

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

就我而言,我根本不需要任何缓存,因此此答案对我非常有帮助。对于其他选择此方向的用户:这些行也放置在didFinishLaunchingWithOptions内。在较新的应用程序中,应省略最后一行(sharedCache版本),因为ARC现在将为您处理。
Isilher

6

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

作为对其他答案的编辑,这样做会更好,因为对于未指定语言的问题,它只是一种不同的语言。
彼得·德威斯

如果您在同一应用程序中使用api +令牌和webview +身份验证,则可以完美地清除缓存会话!
Pelanes

2

我的有根据的猜测是,您看到的内存使用不是来自页面内容,而是来自加载UIWebView及其所有支持的WebKit库。我喜欢UIWebView控件,但这是一个“沉重”的控件,可插入非常大的代码块。

此代码是iOS Safari浏览器的大型子集,可能会初始化大量的静态结构。


但是,当我发布Webview时,它也应该也发布缓存的内容...但是它没有发布缓存的内容...。如何删除缓存的数据
Chandan Shetty SP

阅读您的原始文章,症状是您的内存使用量上升了,但是当您停止使用UIWebView时却没有下降。我的建议是,内存使用不是缓存内容,而是UIWebView加载的代码和数据结构。检查您是否已释放UIWebView控件,而不仅仅是您显示的Web内容。
克里斯·霍金斯

2

我无法更改代码,因此我需要命令行进行测试,并认为这可以帮助某人:

特定于应用程序的缓存存储在中~/Library/Caches/<bundle-identifier-of-your-app>,因此只需按以下说明删除并重新打开您的应用程序

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


1

经过各种尝试,只有这样对我才行(在ios 8下):

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

1

对于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)

在此处设置单独的NSURLCache的用途是什么
RajuBhai Rocker

0

我正在从Documents加载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文件,尽管看起来非常混乱。


Update2:我已经设法解决了。发出新请求后,我也立即重新加载了Webview。由于某些原因,这会正确加载css。
Evgeni Petrov

嘿,我知道这很旧,但是您是什么意思重新加载Webview?调用[webview reload]似乎没有任何作用,我的位置与您相同,已经尝试了所有操作,并且不想在每个脚本和CSS URL中添加随机字符串。
user1234 2015年

那是在iOS6上的2012年,可能是该破解不再起作用。加载后,我打电话给reload。就是这样
Evgeni Petrov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.