使用AFNetworking获取图像时内存增长

时间:2013-02-11 18:06:24

标签: ios memory-management instruments afnetworking

我的iOS应用程序一次一个地提取图像并在屏幕上显示它们(非常像幻灯片)。我遇到了低记忆的情况。在运行Allocations时查看Instruments,我看到内存不断增长。调用树显示正在使用大量内存,但没有一行是我的代码,而且我没有足够的经验来调试这些情况以了解如何阅读它。

Call Tree from 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张图像,因为用户可以向后滑动以查看先前显示的图像。在我的清理方法中,我在图像视图和imageview本身上清零图像,并将其从数组中删除。所以我不确定是什么仍然坚持它并导致内存继续增长。我在这里错过了什么?

1 个答案:

答案 0 :(得分:1)

AFNetworking的UIImageView类别方法将他们检索到的图像静静地存储在共享的AFImageCache对象中,该对象是NSCache的子类。这在性能方面很棒,但我想它可能会导致你的记忆问题。你会看到在每次成功的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

我没有使用仪器对此进行测试,因此我不是百分之百确定它会解决您的问题,但也许它可以帮助解释发生了什么。