美文网首页
关于AFNetworking3.0内存泄漏的解决方案

关于AFNetworking3.0内存泄漏的解决方案

作者: 小明小明小明小小明 | 来源:发表于2018-04-23 17:59 被阅读19次

今天在测试的时候发现连续进入某个页面会出现内存暴涨的情况。用leaks检查后发现是AFNetworking框架报的的内存泄漏。然后查阅了资料和源码。发现问题出现在

[AFHTTPSessionManager manager];

这句代码这里。manager其实并不是一个单例。查看AFNetworking的源码发现它的实现为

+ (instancetype)manager {   

return [[[self class] alloc] initWithBaseURL:nil];

}

意味着我们每次调用都创建了一个实例对象。导致内存泄漏。


现在有两种解决方案。

一 ,自己创建一个单例对象。每次由自己创建的单例对象进行请求。

static AFHTTPSessionManager *manager ;

+ (AFHTTPSessionManager *)sharedHTTPSession

{   

        static dispatch_once_t onceToken;   

        dispatch_once(&onceToken, ^{       

        manager = [AFHTTPSessionManager manager];   

    }); 

      return manager;

}

创建自己的单例类NetworkManager,实例化方法为上代码。

NetworkManager *manager = [NetworkManager  sharedHTTPSession];

 [manager GET:urlStr parameters:para progress:nil success:nil failure:nil];

这样就不会有泄漏了。


二 ,直接修改源码 ,将AFNetworking中的源码manger方法修改了

+ (instancetype)manager {   

    return [[[self class] alloc] initWithBaseURL:nil];

}

将这段代码修改成下面的就行了

static AFHTTPSessionManager *httpManager;

+ (instancetype)manager {       

     static dispatch_once_t onceToken;   

    dispatch_once(&onceToken, ^{      

        httpManager = [[[self class] alloc] initWithBaseURL:nil];   

    });   

    return httpManager;


建议使用第一种,第二种修改了源码。以后你升级AFNetworking需要再次修改源码。

相关文章

网友评论

      本文标题:关于AFNetworking3.0内存泄漏的解决方案

      本文链接:https://www.haomeiwen.com/subject/fsbllftx.html