0

iOSアプリで一度に1つずつ画像を取得し、画面に表示しています(スライドショーのように)。私はメモリ不足の状況に遭遇しています。Allocationsを実行しているときにInstrumentsを見ると、メモリが増え続けていることがわかります。コールツリーには大量のメモリが使用されていることが示されていますが、どの行も私のコードではなく、これらの状況をデバッグしてその読み取り方法を知るのに十分な経験がありません。

インスツルメントからツリーを呼び出す

これが私が画像をフェッチしているコードです:

- (void)fetchLargeImage:(void (^)(UIImage *))completion
{

    // image doesn't exist yet, fetch it now
    NSURL *resourceURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://path_to_image/%@", @"image_name.jpg"];
    NSURLRequest *request = [NSURLRequest requestWithURL:resourceURL];

    AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:^UIImage *(UIImage *image) {
        return image;
    } success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

        completion(image);

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        // image wasn't loaded
    }];

    [operation start];

}

画像が表示されているので、ユーザーが前に表示された画像を確認するために後方にスワイプできるため、最後の10枚の画像を保存します。クリーンアップ方法では、画像ビューの画像と画像ビュー自体を削除し、配列から削除します。ですから、何がまだそれを保持していて、メモリが増え続けているのかわかりません。ここで何が欠けていますか?

4

1 に答える 1

1

AFNetworking の UIImageView カテゴリ メソッドは、取得した画像を、NSCache のサブクラスである共有 AFImageCache オブジェクトに静かに格納します。これはパフォーマンスの点では優れていますが、メモリの問題に寄与している可能性があると思います. AFImageRequestOperation が成功するたびに、次の行が呼び出されることがわかります。

[[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:urlRequest];

私が知る限り、カテゴリメソッドはこれをあまり制御していないようです。UIImageView+AFNetworking.m のコードの編集に慣れている場合は、上記の行をコメント アウトするか、次の行をaf_sharedImageCacheクラス メソッドに追加してキャッシュのサイズを制限します。

[_af_imageCache setCountLimit: 10]; // limits the number of cached images to 10

これを Instruments でテストしていないので、問題が解決するかどうかは 100% 確信が持てませんが、何が起こっているのかを説明するのに役立つかもしれません。

于 2013-02-11T21:37:16.480 に答える