0

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

来自 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 类别方法将它们检索到的图像安静地存储在共享的 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

我没有用 Instruments 测试过这个,所以我不能 100% 确定它会解决你的问题,但也许它有助于解释发生了什么。

于 2013-02-11T21:37:16.480 回答