[AFHTTPSessionManager manager]内存泄漏解决

  • 背景:
    昨晚老大问我下面那段代码是否存在内存泄漏,如图:
    是否存在内存泄漏?

我拍着胸膛说,没有!可是另外一个同事,很肯定的说有,把self改成strongself就好了,后面我看他们测试,总是测不出个所以然来,我就自己来测了。

说明一下:block内存泄漏只有一种情况,self持有了block,block持有了self
可是这里很明显,self没有持有block,这个block是类方法的block,所以不存在内存泄漏。但是用instrument检测,这里确实存在内存泄漏,我就很奇怪,点到这个方法里去看,如下图:

image.png

网上一搜,一大片关于AFNetworking 3.x [AFHTTPSessionManager manager]; 内存泄漏的解决方法。

  • 产生原因
    点进[AFHTTPSessionManager manager]看看,如下图1、2、3、4个步骤定位:
    泄漏定位

最后一步点进去看,如下图:


元凶在这里

发现delegate的修饰符跟我们平时用的有啥不一样?对,它是retain了,所以创建的self.session这个变量永远不会被销毁,从而导致AFHTTPSessionManager 这个类不会被销毁,苹果官方有给出相应的解决方法,请接着看。

  • 解决方法
    方法一:写单例
    网上主流做法把[AFHTTPSessionManager manager]写成单例,没法释放那我就不释放了,反正都要用到。步骤:
  1. 写一个类SessionManager,继承自AFHTTPSessionManager


    SessionManager.h

    SessionManager.m

    刚出问题的代码就改成


    完成版

这样一跑Instrument就没红点点了,内存泄漏完美解决,但是这里还有一个问题,我这边改了manager.responseSerializer,因为是单例,下次一个Post请求要求返回Json格式的这个又要改回去,所以这个要非常注意,要不然请求总会报错。不知道看的小伙伴针对这个问题有没有更好的解决方法?
方法二:手动释放
这是官网给出的NSURLSession释放的方法,

image.png

看解释,我们还是最好用第一个- (void)finishTasksAndInvalidate; 在success和failure的block中调用,如下图:
方法二.png

亲测,红点点也消失了。

还有小伙伴有其他方法欢迎留言。

参考文章:
iOS 使用Leak进行内存泄漏的分析

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

推荐阅读更多精彩内容