1. 程式人生 > >關於使用renderInContext函式後,出現low memory warning解決方法

關於使用renderInContext函式後,出現low memory warning解決方法

為了epub閱讀器的新需求--模擬翻頁,需要使用函式renderInContext進行截圖,然後做模擬特效。當功能實現之後,在用iPad進行功能測試的時候,發現當翻頁次數到10頁左右(在iPhone上測試是翻頁30次才會出現記憶體警告,原因在於iPhone上面的螢幕截圖比iPad的截圖小),系統發出low memory warning(低記憶體警告),而且當警告次數達到一定數量,系統就會直接終止你的程式,而且沒有任何異常丟擲。具體有關低記憶體警告的知識,可以移步此部落格http://www.cnblogs.com/smileEvday/archive/2012/03/07/memorywarning.html

對於低記憶體警告問題,我第一反應是程式是否出現記憶體洩露。於是用Instrustment進行除錯,結果並沒有發現記憶體洩露。但是,程式的記憶體監控顯示記憶體的使用量的確在大幅度增加,而且當記憶體使用達到200MB左右時,系統就會發出低記憶體警告. 既然沒有出現記憶體洩露,但是記憶體又在不斷增加,那麼可以推斷程式持有記憶體,且沒有及時釋放。最後,通過除錯,發現每一次翻頁導致記憶體大幅增加的罪魁禍首就是renderInContext函式。

renderInContext是蘋果提供的函式,用於渲染layer到Core Graphic上下文,然後轉換成圖片。初步猜測,當使用了renderInContext之後,系統並沒有及時釋放相關的記憶體。如果呼叫次數不頻繁,那應該沒有不允許程式正常執行。反正,則導致記憶體大幅增加,出現低記憶體警告。

在stackoverflow上有類似的提問,並且給出瞭解決方法,如下所示:

//渲染

    [selectView.layerrenderInContext:UIGraphicsGetCurrentContext()];

//清空快取

selectView.layer.contents = (id

)nil;

遺憾的是,由於我使用的是UIWebView,因此這個解決方法對於我的情況沒有用。查找了很多資料,發現解決的方法都與上述方法大同小異。為此,我不得自己探索解決方法。雖然上述方法沒有用,但是我覺得其原理應該是沒有錯,即只要把檢視的層清空,就能及時釋放記憶體。由於UIWebView的特殊性,直接將其layer賦值為空,達不到效果。

於是,換一種思路。UIWebView本質上就是一個小型瀏覽器,通過載入Url或者html檔案的方式來設定並顯示內容。於是,就有了下面的解決方法:

[(UIWebView *)selectView loadHTMLString:nilbaseURL:nil];

通過測試,發現這個方法有效可行,能及時釋放系統佔用的記憶體。

為了解決這個問題,前後一共耗費了一個星期的時間,期間嘗試了很多方法,都沒有解決問題。為了讓遇到類似問題的同志們少走彎路,覺得還是很有必要分享一下。