這個坑會在特定的情況下特別明顯:
類似朋友圈的添加多張本地選擇\拍照 的圖片 並在界面上做一個預覽功能
由於沒有特別的相機\相冊需求,則直接使用系統自帶的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; }
結果:
這篇不是干貨,只是解決了一個小問題.