iOS App內存優化之 解決UIImagePickerController的圖片對象占用RAM過高問題


這個坑會在特定的情況下特別明顯:

類似朋友圈的添加多張本地選擇\拍照 的圖片 並在界面上做一個預覽功能

由於沒有特別的相機\相冊需求,則直接使用系統自帶的UIImagePickerController

 

最簡單的方法-> UIImagePickerController 選擇圖片 -> 代理返回圖片對象-> 在array中添加圖片對象 -> 用collectionview顯示->  提交的時候遞歸上傳array的image內容

 

然而這里就發現一個會吃內存的坑...

代理返回的UIImage對象 添加到array時,內存暴漲

 

 

其實也不是添加對象到array里導致的問題,因為我的collectionview 不reload 的話,圖片不顯示時  內存也是正常的,只有把這個image對象放置到UIImageView時 內存才會暴漲

因此懷疑是圖片解碼方面的原因:解碼會調用到ram緩存,以便下次讀取時不用再次解碼

 

然而為了避免app占用ram過高而被系統kill掉,這個圖片必須要處理一下

通過圖片重新繪制得到UIImage這個占用內存的情況會消失

因此寫個Category方法來簡單處理一下就可以了

- (UIImage *)redraw{
    CGFloat width = CGImageGetWidth(self.CGImage);
    CGFloat height = CGImageGetHeight(self.CGImage);

    // 創建一個bitmap的context
    // 並把它設置成為當前正在使用的context
    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    
    // 繪制圖片大小設置
    [self drawInRect:CGRectMake(0, 0, width, height)];
    
    // 從當前context中創建一個圖片
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 使當前的context出堆棧
    UIGraphicsEndImageContext();
    
    // 返回新的改變大小后的圖片
    return image;
}

 

結果:

這篇不是干貨,只是解決了一個小問題.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM