美文网首页
关于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