iosiphonexcodememory-leaksalassetslibrary

Cause of big memory allocation (memory leak?) when reading UIImage from camera roll


I try to modify FGallery (https://github.com/gdavis/FGallery-iPhone). I need it to read images from the camera roll, but I get memory leak.

Old code (path is file location):

@autoreleasepool {

NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle]   bundlePath],_thumbUrl];
_thumbnail = [UIImage imageWithContentsOfFile:path];
_hasThumbLoaded = YES;
_isThumbLoading = NO;
[self performSelectorOnMainThread:@selector(didLoadThumbnail) withObject:nil   waitUntilDone:YES];
}

My code (path is assert library url):

@autoreleasepool {

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) {
   ALAssetRepresentation *rep = [myasset defaultRepresentation];
   CGImageRef iref = [rep fullResolutionImage];
   if (iref) {
       _thumbnail = [UIImage imageWithCGImage:iref];
       _hasThumbLoaded = YES;
       _isThumbLoading = NO;
       [self performSelectorOnMainThread:@selector(didLoadThumbnail) withObject:nil   waitUntilDone:YES];
   }
};        

ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror) {
   NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
};     

NSURL *asseturl = [NSURL URLWithString:_thumbUrl];
[assetslibrary assetForURL:asseturl 
resultBlock:resultblock
failureBlock:failureblock];
}
}

For the same images, I get a big memory allocation (-didReceiveMemoryWarning) that crash the program in my code, but not while using the original code.

Any ideas why?

P.S. I use ARC, and did the automatic transition for FGallery. It works fine for local app images, but as said, I can't make it to work for camera roll images.

edit 1: the program crash


Solution

  • i think i got it. the "ALAssetsLibraryAssetForURLResultBlock resultblock" is running on a different thread. and so the "@autoreleasepool" does not apply to it. (each thread have it's own autorelease pool). hence, the memory footprint is much higher due to lot of "autoreleased" allocations (images). adding "@autoreleasepool" inside the block stopped the crashs and big memory allocations.

    in short:

    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) {
       @autoreleasepool {
          ALAssetRepresentation *rep = [myasset defaultRepresentation];
          CGImageRef iref = [rep fullResolutionImage];
          if (iref) {
              _thumbnail = [UIImage imageWithCGImage:iref];
              _hasThumbLoaded = YES;
              _isThumbLoading = NO;
              [self performSelectorOnMainThread:@selector(didLoadThumbnail) withObject:nil   waitUntilDone:YES];
           }
       }
    }; 
    

    thanks to all who replied.