清除UIWebview缓存

时间:2011-03-29 06:08:02

标签: ios cocoa-touch uiwebview uikit

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

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

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

9 个答案:

答案 0 :(得分:123)

我实际上认为在关闭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]; } } 删除任何关联的Cookie:

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}

斯威夫特3:

{{1}}

答案 1 :(得分:45)

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

所以在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/

答案 2 :(得分:9)

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

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

答案 3 :(得分: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)
    }
}

答案 4 :(得分:2)

我受过教育的猜测是,您所看到的内存使用不是来自页面内容,而是来自加载UIWebView及其所有支持WebKit库。我喜欢UIWebView控件,但它是一个“重型”控件,可以输入非常大的代码块。

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分: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)

答案 8 :(得分:0)

我正在从Documents加载html页面,如果它们具有相同的css文件名UIWebView,它似乎不会抛出以前的css规则。也许是因为他们有相同的网址。

我试过了:

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:我找到了this 更改html文件虽然看起来非常混乱。