2

Я разрабатываю приложение для фотогалереи с помощью AssetsLibrary для загрузки фотографий моего устройства. Когда вы представляете случайное изображение в другом VC, я заметил следующее: для моего изображения полного изображения загружается изображение imageView (путь намного дольше, чем родной photosApp), и я также получаю из журнала «Received» память "после загрузки нескольких изображений. Если я установлю свое представление на fullScreenImage, предупреждения перестанут, но я не хочу этого. Что я должен изменить для обеспечения гладкой производительности и высококачественных изображений на экране?Загрузка изображения с предупреждением о получении памяти GCD

Вот код, надеюсь, что вы можете сказать мне, в чем проблема:

Это VC, где я хочу представить мое изображение на экране

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"%@",assetsController); 

    detailImageView = [[UIImageView alloc]initWithFrame:self.view.bounds]; 
    [self.view addSubview:detailImageView]; 
    detailImageView.image = smallImage; //small image is my asset thumbnail and is passed as an argument in my init function 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     ALAsset *asset = [assetsController.albumPics objectAtIndex:assetsController.index]; 
     ALAssetRepresentation *representation = [asset defaultRepresentation]; 

     bigImage = [[UIImage imageWithCGImage:[representation fullResolutionImage]]retain]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      detailImageView.image = bigImage; 

     }); 
     [pool release]; 
    }); 
} 

UPDATE 1

{ 
     UIImageView *detailImageView = [[UIImageView alloc]initWithFrame:self.view.bounds]; 
     [self.view addSubview:detailImageView]; 
     detailImageView.image = smallImage; 


     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

      ALAsset *asset = [assetsController.albumPics objectAtIndex:assetsController.index]; 
      ALAssetRepresentation *representation = [asset defaultRepresentation]; 

      UIImage *bigImage = [UIImage imageWithCGImage:[representation fullResolutionImage]]; 


      dispatch_async(dispatch_get_main_queue(), ^{ 

       detailImageView.image = bigImage; 

      }); 
      [pool release]; 

     }); 
} 

enter image description here

+1

пытаются выпускать [bigImage релиз]; после detailImageView.image = bigImage; – BhushanVU

+0

@bhuXan пробовал это уже и все еще получал предупреждения после нескольких загрузок изображений ... – QuiBongJin

+0

с использованием jpeg-изображений или преобразования png в jpeg должен делать .... – BhushanVU

ответ

0

Является ли bigImage переменной экземпляра? Используется ли он в любом месте, кроме здесь? Если он не используется нигде, то он должен быть локальной переменной, и вы не должны его сохранять. Если это переменная экземпляра, которую вы сохраняете, вам нужно освободить предыдущее значение перед назначением ему нового значения.

То же самое относится и к дискуссии detailImageView

+0

Действительно, оба были переменными экземпляра, но никогда не использовались где-то в другом месте, поэтому я преобразовал их в локальные переменные. Посмотрите на обновление – QuiBongJin

+0

. Еще получая предупреждение – QuiBongJin

+0

, также необходимо выпустить 'detailImageView' в конце метода – newacct