2016-01-01 2 views
0

Я использую AFI Networking 3.0 UIImageView + AFNetworking для отображения изображений в UICollectionView.UIImageView + AFNetworking Утечка памяти из cg растровых данных

Однако, поскольку я продолжаю прокручивать, использование памяти моего приложения постоянно растет. Я использовал инструмент «Инструменты для ассигнований» и могу сузить проблему до CG Raster Data, которая продолжает расти для каждого загружаемого изображения. Глядя на детали CG Raster Data, ответственным абонентом является cgdataprovidercreatewithcopyofdata, а ответственная библиотека - CoreGraphics. Для каждой загруженной ячейки память в 240 КБ теряется впустую.

Существует много подобных проблем при переполнении стека, но ничто действительно не помогает/не имеет решения.

Я думал, что это может быть из-за кэша, поэтому я включил следующие, но не помогло вообще:

NSURLCache * sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:10 * 1024 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 

Я попытался обертывание setImageWithURLRequest внутри autoreleasepool, но не помогло.

Я пробовал искать cgdataprovidercreatewithcopyofdata во всем приложении, но не нашел никаких хитов в своем приложении или в сети. Однако, если я удалю загрузку изображения, я не вижу этой проблемы.

Также, если я удаляю настройку изображения внутри обработчика завершения, память все еще растет. Это означает, что setImageWithURLRequest сам является виновником, а не настройкой изображения внутри обработчика завершения.

Я боролся с этим какое-то время, любая помощь была бы оценена!

Вот мой код для настройки изображения:

[cell.thumbnail cancelImageDownloadTask]; 
__weak UIImageView *weakImageView = cell.thumbnail; 
@autoreleasepool { 
        [cell.thumbnail setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl/image.png"]] 
              placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
                success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
                 UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions 
                 if (!strongImageView) return; 

                 [UIView transitionWithView:strongImageView 
                     duration:0.3 
                      options:UIViewAnimationOptionTransitionCrossDissolve 
                     animations:^{ 
                      strongImageView.image = image; 
                     } 
                     completion:NULL]; 
                } 
                failure:NULL]; 

Вот скриншоты из инструментов:

enter image description here

enter image description here

+2

Вы можете использовать SDWebImage библиотеки для разрешить проблему утечки и очистить кеш и кеш, а некоторые другие функции также поддерживаются в этой библиотеке. Это может вам помочь. https://github.com/rs/SDWebImage –

+0

@AjayGabani спасибо, я закончил тем, что использовал это, но у него была та же проблема. Но затем я добавил метод, который выполняется каждые несколько секунд, чтобы очистить кеш, поскольку SDWebImage хотя бы предоставил метод для него. Похоже, что это значительно снизило использование, но не полностью, но намного лучше. –

ответ

0

я использовал @ajay gabani ответ использовать SDWebImage вместо Просмотр изображений AFNetworking.

В SDWebImage он по крайней мере предоставил возможность очистить кеш, и вы можете контролировать, кэшируется ли изображение на диске или только в памяти.

Я поставил maxMemoryCountLimit до 10, но это, кажется, не делать в моем тестировании:

SDImageCache *imageCache = [SDImageCache sharedImageCache]; 
imageCache.maxMemoryCountLimit=10; 

очистить кэш каждые несколько секунд:

[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(simulateMemoryWarning) userInfo:nil repeats:YES]; 

- (void)simulateMemoryWarning{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 
    SDImageCache *imageCache = [SDImageCache sharedImageCache]; 
    NSLog(@"Simulated"); 
    [imageCache clearMemory]; 
    [imageCache clearDisk]; 
}