Ios 使用AFNetworking下载图像-内存赢得';t使用ARC弹出ViewController后释放

Ios 使用AFNetworking下载图像-内存赢得';t使用ARC弹出ViewController后释放,ios,objective-c,memory-management,automatic-ref-counting,afnetworking,Ios,Objective C,Memory Management,Automatic Ref Counting,Afnetworking,我的应用程序出现了一些奇怪的内存问题。 经过一些调试后,我将问题隔离到一个带有一个视图控制器的新项目中。 因此,现在我的测试应用程序包含一个UINavigationController,它连接到一个ViewController,带有一个按钮,按下下一个ViewController: #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation Vie

我的应用程序出现了一些奇怪的内存问题。 经过一些调试后,我将问题隔离到一个带有一个视图控制器的新项目中。 因此,现在我的测试应用程序包含一个
UINavigationController
,它连接到一个
ViewController
,带有一个按钮,按下下一个
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];
    }    
}
#导入“ViewController.h”
#导入“AFNetworking.h”
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad
{
[超级视图下载];

对于(int i=0;iUIImageView+AFNetworking
类别使用
NSCache
子类缓存图像,这意味着它将使您无需重新检索图像(这非常有用,如果您返回此视图控制器,可避免性能/网络影响)。此缓存会在内存压力下自动清除,因此您可能不需要担心它(只要您确信视图控制器本身正在正确地解除分配,并且不会受到某些强引用循环或类似问题的影响)

如果确实要清除此缓存,则必须对
UIImageView+AFNetworking
代码进行一些更改,以公开
AFImageCache
类。您可能希望使其成为一个适当的单例类(因为现有的实现依赖于
UIImageView+AFNetworking
来控制
af\u sharedImageCache
),然后可以使用
NSCache
方法
removeAllObjects
清除缓存

您可能需要权衡进行这项工作的利弊。例如,它是否真的有缓存问题(因为缓存在内存压力下会自动清除)?如果您不必要地清空缓存,您的应用程序将无法享受缓存的性能优势。如果您创建了AFNetworking,而作者没有将其合并回代码的主要分支,那么这将为您将来的AFNetworking更新留下什么呢

如果您决定要控制缓存,您也可以考虑从项目中排除<代码> AfDeNe+UIVIEVIEW ,并考虑使用不同的<代码> UIIVIEVIEW 类别,它提供对缓存的一些控制。例如,我相信,如果您想要的话,可以公开缓存,这样您就可以清除它。(它还提供了其他优势)。可能有许多比AFNetworking更强大的

UIImageView
类别



另一方面,我们通常不会预先加载所有100个图像,而是采用延迟加载图像,只设置在任何给定时刻可见的图像视图的
image
属性,并在滚动到视图时加载其他图像。而
UIImageView+AFNetworking
类别处理优雅的异步加载压缩图像以确保应用程序的响应性。如果您提前加载100个图像,可能会对应用程序可能需要执行的其他网络操作(如果有)产生不利影响.

这是如何编译的?setImageWithURL是一个IKImageView方法,而不是UIImageView方法。@rdelmar它是一个
UIImageView+AFNetworking
方法。@Rob,哦,好的,错过了AFNetworking标记。我在使用NSCache时不知道内存管理。回答得很好。谢谢!