-
背景:
昨晚老大问我下面那段代码是否存在内存泄漏,如图:
我拍着胸膛说,没有!可是另外一个同事,很肯定的说有,把self改成strongself就好了,后面我看他们测试,总是测不出个所以然来,我就自己来测了。
说明一下:block内存泄漏只有一种情况,self持有了block,block持有了self
可是这里很明显,self没有持有block,这个block是类方法的block,所以不存在内存泄漏。但是用instrument检测,这里确实存在内存泄漏,我就很奇怪,点到这个方法里去看,如下图:
网上一搜,一大片关于AFNetworking 3.x [AFHTTPSessionManager manager]; 内存泄漏的解决方法。
-
产生原因
点进[AFHTTPSessionManager manager]看看,如下图1、2、3、4个步骤定位:
最后一步点进去看,如下图:
发现delegate的修饰符跟我们平时用的有啥不一样?对,它是retain了,所以创建的self.session这个变量永远不会被销毁,从而导致AFHTTPSessionManager 这个类不会被销毁,苹果官方有给出相应的解决方法,请接着看。
-
解决方法
方法一:写单例
网上主流做法把[AFHTTPSessionManager manager]写成单例,没法释放那我就不释放了,反正都要用到。步骤:
-
写一个类SessionManager,继承自AFHTTPSessionManager
刚出问题的代码就改成
这样一跑Instrument就没红点点了,内存泄漏完美解决,但是这里还有一个问题,我这边改了manager.responseSerializer,因为是单例,下次一个Post请求要求返回Json格式的这个又要改回去,所以这个要非常注意,要不然请求总会报错。不知道看的小伙伴针对这个问题有没有更好的解决方法?
方法二:手动释放
这是官网给出的NSURLSession释放的方法,
看解释,我们还是最好用第一个- (void)finishTasksAndInvalidate; 在success和failure的block中调用,如下图:
亲测,红点点也消失了。
还有小伙伴有其他方法欢迎留言。
参考文章:
iOS 使用Leak进行内存泄漏的分析