我正在开发一个使用大量图片的应用,我使用UIWebView
使用JavaScript代码表示大约200张图片(我正在使用UIZE库),问题是当我完成UIWebView
时,我在viewWillDisappear
-(void)viewWillDisappear:(BOOL)animated {
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[webViews stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
}
带
- (void)viewDidUnload
{
webViews = nil;
}
- (void)dealloc {
[webViews release];
}
但是,从UIWebView获取的保留内存仍在内存中,所以我的第一个问题是如何强制应用程序释放从UIWebView
获取的内存?
同样的问题与UIImageView
一样,我正在使用大图像(大约3072 * 2024)从内存中获取(3072 * 2024 * 3 = 18 MB),我正在加载大约8像这样的图像,所以保留的内存是巨大的,当我试图释放它们时,同样的事情发生,从每个图像中取出的保留内存仍然在内存中(我总是得到警告,说Low Memory warning
)。我已设法加载大约2个大小的图像以减少保留的内存,但内存不释放内存,直到出现低内存警告,所以,我怎样才能减少和处理大量的图像和在实例中释放保留的内存!?
注意:
我使用了[UIImage imageNamed:];
方法的黑客版本,如下所示:
@implementation UIImage(imageNamed_Hack)
+ (UIImage *)imageNamed:(NSString *)name {
return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], name ] ];
}
@end
任何帮助将不胜感激。
提前谢谢。答案 0 :(得分:5)
在发布之前还有许多事要做,并设置为nil。
删除所有缓存的HTTP响应:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
甚至设置WebKit缓存模型:
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
将背景设置为任何颜色,以便WebKit清理缓存的显示内存:
[webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"];
然后关闭文件:
[webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close()"];
答案 1 :(得分:4)
试试这个:
- (void)viewDidUnload
{
[webViews release];
webViews = nil;
}
在将其设置为nil之前释放非常重要。将变量设置为nil并不意味着它被释放。您将其指针设置为nil,但之前指向的内存将保留在那里并导致泄漏。这是主要问题。
使用图像,您可以执行以下操作:
在这些情况下不要使用UIImageView,我建议使用CATiledLayer并直接在其上渲染图像。
以下是它的类引用:CATiledLayer
它有两个示例应用程序。我认为您应该检查Apple创建的PhotoScroller应用程序,它可以让您了解如何解决您的问题。主要思想是在图块中渲染图像,因此只会渲染部分图像,这些图像位于屏幕上,这样可以节省大量内存,因为它不会渲染屏幕部分。