2012-02-18 103 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