从内存中释放UIWebView内容,强制应用程序释放内存

时间:2012-02-18 17:07:44

标签: memory-management ios4 uiwebview uiimageview

我正在开发一个使用大量图片的应用,我使用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

任何帮助将不胜感激。

提前谢谢。

2 个答案:

答案 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应用程序,它可以让您了解如何解决您的问题。主要思想是在图块中渲染图像,因此只会渲染部分图像,这些图像位于屏幕上,这样可以节省大量内存,因为它不会渲染屏幕部分。

相关问题