0

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];

計測器のスクリーンショットは次のとおりです。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1