2014年4月5日 星期六

iOS 開發筆記 - ALAssetsLibrary assetForURL defaultRepresentation fullResolutionImage - Terminated due to Memory Pressure

最近設計 app 時,開始把圖片存進內建得相本裡,而不使用 app sandbox 空間,然而要取出圖片時,就會碰到 Terminated due to Memory Pressure 的問題,追一下,大概是瞬間取太多張照片 :P 此為 ARC 模式。

解法:
  1. 降低瞬間取照片的數量
  2. 使用 @autoreleasepool{ } 處理記憶體管理
例如:

[self.library assetForURL:[NSURL URLWithString:@"assets-library://..."] resultBlock:^(ALAsset *asset) {
                                //NSLog(@"asset:%@",asset);
                                UIImage *image = nil;
                                @autoreleasepool {
                                    image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
                                }
                            } failureBlock:^(NSError *error) {
                            }];


只是,這樣也沒有真的避免大量記憶體的使用 Orz 因為 [asset defaultRepresentation] fullResolutionImage] 真的吃滿大的記憶體,例如 5MB 大小的照片,處理一張照片時,記憶體會瞬間加了 30~50MB,所以瞬間處理 3~5 張時,記憶體還可能衝到 2xxMB ,直到 Terminated due to Memory Pressure。暫時想到的解法就只能透過降低處理照片的張數了。

實際例子是 app 初始化完大概 20MB 記憶體,跑上述 code 處理 3 張照片可以吃到 90MB,不曉得是不是 CGImage 的關係?改天有空再追一下。

1 則留言: