我使用UIWebview使用loadRequest:
方法加载网页,当我离开那个场景时,我调用[self.webView stopLoading];
并释放webView。
在第一次启动时的活动监视器中,我看到实际内存增加了4MB,并且在多次启动/加载时,实际内存不会增加。它只增加一次。
我已经检查过webview的保留计数。这是正确的,即0.我认为UIWebView正在缓存一些数据。如何避免缓存或删除缓存数据?或者还有其他原因吗?
答案 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)
// 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文件虽然看起来非常混乱。