0

UPDATE這段代碼其實不是問題所在;註釋掉所有CoreGraphics行並返回數組中的第一個圖像,因爲結果並不能防止崩潰的發生,所以我必須向上遊看。CoreGraphics內存警告和崩潰;儀器顯示沒有內存泄漏

我在75ms NSTimer上運行這個。它適用於480x360的圖像,並且可以整天運行而不會崩潰。

但是,當我發送的圖像是1024x768,它會在大約20秒後崩潰,給出了幾個低內存警告。

在這兩種情況下,儀器都顯示絕對正常的內存使用情況:平面分配圖,小於一兆字節的活動字節,整個時間無泄漏。

那麼,這是怎麼回事?核心圖形不知何故使用太多內存而不顯示它?

另外值得一提的是:(NSMutableArray *)imgs中沒有那麼多圖像 - 通常是三個,有時是兩個或四個。無論如何崩潰。只有兩個時,碰撞速度稍快。

- (UIImage*) imagefromImages:(NSMutableArray*)imgs andFilterName:(NSString*)filterName { 

    UIImage *tmpResultant = [imgs objectAtIndex:0]; 

    CGSize s = [tmpResultant size]; 

    UIGraphicsBeginImageContext(s); 

    [tmpResultant drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeNormal alpha:1.0]; 

    for (int i=1; i<[imgs count]; i++) { [[imgs objectAtIndex:i] drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeMultiply alpha:1.0]; } 

    tmpResultant = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return tmpResultant; 
} 
+0

崩潰日誌顯示多少內存?你使用'[UIImage imageNamed:]'? – Kevin

+0

我沒有在任何地方使用[UIImage imageNamed:] - 所有圖像都從相機捕獲併發送到imageBuffer類,該類返回圖像的NSMutableArrays。它崩潰而沒有崩潰日誌輸出,但在設備日誌中,它看起來像進程正在使用62582個頁面。 –

回答

0

聽起來像我這樣的問題是你已經顯示的代碼之外。屏幕上顯示的圖像在應用程序內存之外有一個後備存儲,寬度*高度* bytes_per_pixel。如果您的支持存儲太多,您還會收到內存警告和應用程序終止。

您可能需要在那裏進行優化,以創建這些圖像的較小優化版本以供顯示或允許發佈後備存儲。對於某些非變化圖層,啓用光柵化也可以幫助您將圖層內容直接設置爲CGImage,而不是使用UIImages。

您應該製作一個示例項目,演示其周圍沒有其他代碼的問題並查看您是否仍然內存不足。但是因爲我懷疑你會發現,只要你已經顯示的代碼,你將無法再現其他地方的isse。

+0

這是完全正確的;我減少了正在存儲的'UIImage'的數量,這就停止了崩潰。 爲了解決這個限制,我將嘗試將圖像存儲爲'UIImageJPEGRepresentation's,然後根據需要將它們重新放入'[UIImage imageWithData:]'中。希望它會足夠快。 –