2016-06-07 76 views
0

我使用此代碼從相冊使用照片框架檢索照片, 我已成功檢索PHAssets並將其放入數組,但我無法將其轉換爲圖像,它在這個過程中崩潰。從PHAssets請求圖像數組導致內存異常

這裏是我的代碼,

-(void)retrieveAllPhotoSetWithCompletionCallback:(void(^ __nonnull)(NSMutableArray * __nullable asset ,NSMutableArray * __nullable imageArray , BOOL complete))completionCallback{ 

    self.requestOptions = [[PHImageRequestOptions alloc] init]; 
    self.requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact; 
    self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; 
    self.requestOptions.synchronous = YES; 

    NSMutableArray *assetsArray = [NSMutableArray new]; 
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 
    [fetchResult enumerateObjectsUsingBlock:^(PHAsset *_Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) { 

     [assetsArray addObject:asset]; 
    }]; 

    PHImageManager *manager = [PHImageManager defaultManager]; 
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:[assetsArray count]]; 

    // assets contains PHAsset objects. 
// __block UIImage *ima; 
    int i = 0; 

    for(PHAsset *asset in assetsArray) { 
     // This autorelease pool seems good (a1) 
     @autoreleasepool { 

      [manager requestImageForAsset:asset 
           targetSize:PHImageManagerMaximumSize 
           contentMode:PHImageContentModeDefault 
            options:self.requestOptions 
          resultHandler:^(UIImage *image, NSDictionary *info) { 

           dispatch_async(dispatch_get_main_queue(), ^{ 

         //you can add autorelease pool here as well (a2) 
        @autoreleasepool { 

         //assetCount++; 
         NSLog(@"started requesting image %i", i); 

         NSError *error = [info objectForKey:PHImageErrorKey]; 

         if (error) 
          NSLog(@"Image request error: %@",error); 
         else { 
          NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]]; 
          NSData *imageData = UIImagePNGRepresentation(image); 
          if(imageData) { 
           [imageData writeToFile:imagePath atomically:YES]; 
           [images addObject:imagePath]; 
          } 
          else { 
           NSLog(@"Couldn't write image data to file."); 
          } 
          NSLog(@"finished requesting image %i", i); 
         } 
        } //a2 ends here 
       }); 
      }]; 
      i++; 
     } // a1 ends here 
    } 
    completionCallback(assetsArray,images,YES); 
} 

回答

0

我認爲問題是與這裏的requestImageForAsset:asset targetSize:PHImageManagerMaximumSize你正在服用的最大尺寸與在程序中可用。這導致將最大尺寸的圖像存儲在RAM中。通過存儲多個它會在RAM中吃掉更多的內存並且它會崩潰。我調整了targetSize的大小,內存使用量比以前少了。