我使用UIWebview来使用loadRequest:
方法加载网页,当我离开该场景时,我调用[self.webView stopLoading];
并释放了webView。
在第一次启动的活动监视器中,我看到实际内存增加了4MB,并且在多次启动/加载时,实际内存没有增加。它仅增加一次。
我已经检查了webview的保留计数。这是正确的,即0。我认为UIWebView正在缓存一些数据。如何避免缓存或删除缓存的数据?还是有其他原因?
我使用UIWebview来使用loadRequest:
方法加载网页,当我离开该场景时,我调用[self.webView stopLoading];
并释放了webView。
在第一次启动的活动监视器中,我看到实际内存增加了4MB,并且在多次启动/加载时,实际内存没有增加。它仅增加一次。
我已经检查了webview的保留计数。这是正确的,即0。我认为UIWebView正在缓存一些数据。如何避免缓存或删除缓存的数据?还是有其他原因?
Answers:
我实际上认为,当您关闭时,它可能会保留缓存的信息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)
}
}
不要完全禁用缓存,这会损害您的应用性能,这是不必要的。重要的是在应用启动时显式配置缓存,并在必要时清除它。
因此在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/
您可以通过执行以下操作禁用缓存:
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];
雨燕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浏览器的大型子集,可能会初始化大量的静态结构。
对于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)
我正在从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文件,尽管看起来非常混乱。