ios - 使用 AFNetworking 下载图像 - 使用 ARC 弹出 ViewController 后内存不会释放

标签 ios objective-c memory-management automatic-ref-counting afnetworking

我的应用遇到了一些奇怪的内存问题。 经过一些调试后,我将问题隔离到一个带有一个 View Controller 的新项目中。 所以现在我的测试应用程序包含一个连接到 ViewControllerUINavigationController,并带有一个按钮,可以按下一个 ViewController:

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    for(int i=0;i<100;i++)
    {
        NSString *rightImageUrl = [NSString stringWithFormat:@"%@/%@-iphone%@.png",ImagesURL,[NSString stringWithFormat:@"%d",i],@"4"];
        UIImageView *rightImageView = [[UIImageView alloc]initWithFrame:CGRectMake(6, 50*i , 139, 200)];
    [rightImageView setImageWithURL:[NSURL URLWithString:rightImageUrl]];
        [self.view addSubview:rightImageView];
    }    
}

以上是我现在测试应用程序中的所有代码。

根据 Instruments,上面需要 X 内存量(10mb,20mb .. 取决于循环的数量)问题是当我弹出 时,上面分配的内存不会被释放 View Controller

我试过使用@autoreleasepool 将代码包装在 for 循环中,但这并没有起到多大作用。

请指教

最佳答案

UIImageView+AFNetworking 类别使用 NSCache 子类缓存图像,这意味着它将使您无需重新检索图像(这非常有用,避免返回此 View Controller 时对性能/网络的影响)。这个缓存在内存压力下会自动清除,所以你可能不需要担心它(只要你确信你的 View Controller 本身正在正确释放并且不会受到某些强引用循环或之类的)。

如果您真的想清除此缓存,则必须对 UIImageView+AFNetworking 代码进行一些更改以公开 AFImageCache 类。你可能想让它成为一个合适的单例类(因为现有的实现依赖于 UIImageView+AFNetworking 来控制 af_sharedImageCache),然后你可以使用NSCache 方法 removeAllObjects

您可能必须权衡完成这项工作的利弊。例如,它有一个缓存真的是个问题吗(因为缓存会在内存压力时自动清除,无论如何)?如果您不必要地清空缓存,您的应用将无法享受缓存带来的性能优势。如果您 fork AFNetworking 并且作者没有将其合并回代码的主要分支,那么您将在何处进行 future 的 AFNetworking 更新?

如果您决定要控制缓存,您还可以考虑从您的项目中排除 AFNetworking+UIImageView 并考虑使用不同的 UIImageView 类别来提供一些控制缓存。例如,我相信 SDWebImage公开缓存,以便您可以根据需要清除它(它也提供其他优点)。可能有很多 UIImageView 类别比 AFNetworking 的类别更强大。


顺便说一句,我们通常会采用惰性加载图像,而不是预先加载所有 100 张图像,只设置那些在任何给定时刻可见的 ImageView 的 image 属性,并且在其他人滚动到 View 中时加载其他人。 UIImageView+AFNetworking 类别处理图像的优雅异步加载以确保应用响应。如果您预先加载 100 张图片,它可能会对您的应用可能需要执行的其他网络操作(如果有的话)产生不利影响。

关于ios - 使用 AFNetworking 下载图像 - 使用 ARC 弹出 ViewController 后内存不会释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18730722/

相关文章:

objective-c - NSManagedObjectContext 通过通知中心问题在多个线程上保存/合并

iphone - 从内存中删除 ViewController

c - 难以分配额外的内存吗?

ios - 从 Interface Builder 实例化的 View 中的僵尸对象

ios - 在 viewDidLoad 中初始化的变量范围到另一个方法

node.js - v8/node.js 中的内部数组表示

ios - 可从 iOS 中的锁定屏幕访问的按钮

ios - 如何处理代码中的 NSLayoutConstraint 冗长问题?

ios - Objective C 中未找到方法

ios - PHChange changeDetailsForFetchResult - 总是返回 nil