AFNetworking 3.0 の UIImageView+AFNetworking を使用して、UICollectionView に画像を表示しています。
ただし、スクロールし続けると、アプリのメモリ使用量が永遠に増え続けます。私は Instruments Allocations ツールを使用し、読み込まれるすべての画像に対して成長し続ける CG ラスター データに問題を絞り込むことができました。の詳細を見ると、CG Raster Data
担当の呼び出し元はcgdataprovidercreatewithcopyofdata
で、担当のライブラリはCoreGraphics
です。読み込まれたセルごとに、240 KB のメモリが無駄になります。
スタック オーバーフローに関しても同様の問題が多数ありますが、実際に役立つものや解決策があるものはありません。
これはキャッシュが原因かもしれないと思ったので、次を有効にしましたが、まったく役に立ちませんでした:
NSURLCache * sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:10 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
setImageWithURLRequest
内側を包んでみましたautoreleasepool
が、役に立ちませんでした。
アプリ全体で検索してみcgdataprovidercreatewithcopyofdata
ましたが、自分のアプリや afnetworking でヒットしませんでした。ただし、画像の読み込みを削除すると、この問題は発生しません。
また、完了ハンドラー内のイメージの設定を削除しても、メモリは引き続き増加します。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];
計測器のスクリーンショットは次のとおりです。