Я использую 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];
Вот скриншоты из инструментов:
Вы можете использовать SDWebImage библиотеки для разрешить проблему утечки и очистить кеш и кеш, а некоторые другие функции также поддерживаются в этой библиотеке. Это может вам помочь. https://github.com/rs/SDWebImage –
@AjayGabani спасибо, я закончил тем, что использовал это, но у него была та же проблема. Но затем я добавил метод, который выполняется каждые несколько секунд, чтобы очистить кеш, поскольку SDWebImage хотя бы предоставил метод для него. Похоже, что это значительно снизило использование, но не полностью, но намного лучше. –