2012-02-18 110 views
2

我正在开发一个使用大量图像的应用程序,我使用UIWebView来代表使用JavaScript代码的约200个图像(我正在使用UIZE库),问题是当我与UIWebView做,我用下面的代码viewWillDisappear从内存中释放UIWebView内容,强制应用程序释放内存

-(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 

任何帮助将不胜感激。

Thx提前。

回答

4

试试这个:

- (void)viewDidUnload 
{ 
[webViews release]; 
webViews = nil; 
} 

将其设置为nil之前释放这是非常重要的。将变量设置为零并不意味着它被释放。您将它的指针设置为零,但它之前指向的内存将保持在那里并导致泄漏。这是主要问题。

对于图像,您可以执行以下操作: 在这些情况下不要使用UIImageView,我建议使用CATiledLayer并直接在其上绘制图像。
下面是它的类参考:CATiledLayer
它有两个示例应用程序。我认为你应该检查由Apple创建的PhotoScroller应用程序,它可以让你知道如何解决你的问题。主要思想是以瓷砖渲染图像,因此只有部分图像将被渲染,目前在屏幕上,这样可以节省大量内存,因为它不会渲染屏幕部分。

+0

伟大的答案,好的工作伙计,thx很多,我有一个问题给你,我如何创建一个图像的瓷砖? – Scar 2012-02-23 08:27:02

+0

我发现了一个名为ImageMagick的应用程序,另一个名为Image Cutter的应用程序,如果您知道另一个可以帮助我的软件,我将非常感谢您的帮助,感谢您的回答。 – Scar 2012-02-23 09:18:43

+1

停止! :D您不需要创建切片。 CATiledLayer正在为您做所有事情。你只需要实现它。它有一种渲染图像的方法,它总是呈现图像的一部分,这就是魔法所在。告诉我,如果你不明白这一点。 – 2012-02-23 09:50:07

5

发布之前还有很多事情要做,并设置为零。

删除所有缓存的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()"]; 
+0

感谢您的提示。 – Scar 2012-02-23 09:19:22