清除UIWebviewcaching
我用UIWebview加载一个网页使用loadRequest:
方法,当我离开那个场景我调用[self.webView stopLoading];
并释放webView。
在第一次启动的活动监视器中,我看到真实内存增加了4MB,并且在多次启动/加载实际内存时没有增加。 它只增加一次。
我检查了webview的保留数。 这是适当的,即0.我认为UIWebView正在caching一些数据。 我如何避免caching或删除caching的数据? 还是有另一个原因呢?
实际上我认为在closuresUIWebView
时可能会保留caching的信息。 我尝试从我的UIViewController
删除一个UIWebView
,释放它,然后创build一个新的。 新的一个记住,当我回到一个地址,而不必重新加载一切(它记得我以前的UIWebView
login)时,我在哪里。
所以有几点build议:
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];
这将为特定请求移除caching的响应。 还有一个调用会移除在UIWebView
上运行的所有请求的caching响应:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
之后,您可以尝试使用UIWebView
删除任何关联的Cookie:
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) } }
不要完全禁用caching,这会损害您的应用程序的性能,这是没有必要的。 重要的是在应用程序启动时显式configurationcaching,并在必要时清除caching。
所以在application:DidFinishLaunchingWithOptions:
configurationcaching限制如下:
- (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 }
一旦你有正确的configuration,然后当你需要清除caching(例如在applicationDidReceiveMemoryWarning
或当你closures一个UIWebView
)只是做:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
你会看到内存已经恢复。 我在这里博客了这个问题: http : //twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/
您可以通过执行以下操作来禁用caching:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release];
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) } }
我的教育猜测是,你所看到的内存使用不是来自页面内容,而是来自加载UIWebView及其所有支持WebKit库。 我喜欢UIWebView控件,但它是一个“沉重的”控件,它牵扯到一大块代码。
此代码是iOS Safari浏览器的一个大型子集,可能会初始化大量静态结构。
经过各种尝试,只有这对我来说很好(在ios 8下):
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil]; [NSURLCache setSharedURLCache:cache];
我无法更改代码,所以我需要命令行来testing目的,并认为这可以帮助某人:
特定于应用程序的caching存储在~/Library/Caches/<bundle-identifier-of-your-app>
,因此只需按照以下方式删除并重新打开应用程序
rm -rf ~/Library/Caches/com.mycompany.appname/
对于迅捷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)
我从文档加载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];
它拒绝抛出它的caching数据! 令人沮丧!
我正在做一个PhoneGap(Cordova)应用程序。 我没有在孤立的UIWebView中尝试过。
Update1:我find了 。
更改html文件,虽然看起来很杂乱。