iOS从头开始做一个APPbugsios 面试

[AFHTTPSessionManager manager]内存

2017-11-10  本文已影响96人  小如99

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

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

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

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


元凶在这里

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

  1. 写一个类SessionManager,继承自AFHTTPSessionManager


    SessionManager.h
    SessionManager.m

    刚出问题的代码就改成


    完成版

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

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

亲测,红点点也消失了。

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

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

上一篇下一篇

猜你喜欢

热点阅读