使用AFN出现的内存泄露问题

好吧,虽然标题是和AFN有关,而本人也非常喜欢用AFN这个库,但是今天使用leaks测试了一下发现所有出现红XX的地方全部都是和AFN有关,如果你使用了AFN而且使用leaks测试了你可能就会出现下面的这张图:


内存泄露.png

好吧红xx那张图我就不截图了,实在没心情看,你们可以看到图中所有的内存泄露都和NSURLSession有关。
还是回到今天的主题吧,大家使用AFN都会基于AFN进行二次封装,(这个毋庸置疑吧,额,要是不封装的别打脸),估计很多人封装AFN的时候都是这样的:

#pragma mark - /*** 单例方法 ***/
static id _instance;
+ (instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc]init];
    });
    return _instance;
}

这是一个单例木有错,但是很多人封装请求方法的时候又是这样的:

#pragma mark - /*** POST请求 ***/
- (void)postWithURL:(NSString *)url parameters:(NSDictionary *)para sucess:(AFSuccessCall)sucess failure:(AFFailCall)failure
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/json", @"text/javascript",@"text/plain",nil];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    [manager POST:url parameters:para constructingBodyWithBlock:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (sucess) {
            
            sucess(responseObject);
        }
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            
            failure(error);
        }
    }];
}

好吧,终于要说到重点了,请注意这一行:

  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

这一看就像是一个单例没错吧,其实我也是这么觉得的,但是、但是、但是(你懂得)。出现内存泄露的根源就是这个家伙,它只是一个类方法(真的只是一个类方法),所以我们只要有网络请求 都会实例化一个对象出来,后果可想而知,那解决方案就不用我说了吧:将它封装成一个单例吧!至于怎么整一个单例出来我就不写了(不懂得自纠小GG)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,595评论 25 708
  • 1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具...
    红楼那一场梦阅读 3,537评论 2 3
  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,404评论 0 12
  • 道可道,非常道。意思是:憋说话,一说就偏了。可是,说话犯错,不说话寂寞。凡人没人能耐住寂寞,都想make some...
    两岸青山阅读 256评论 1 3