美文网首页收藏的简书iOS精学选辑iOS知识积累
iOS 使用Leak进行内存泄漏的分析

iOS 使用Leak进行内存泄漏的分析

作者: 晴天WJ | 来源:发表于2017-02-22 12:34 被阅读2004次

第一次使用Leak对项目进行内存泄漏的检测,也是查阅了许多资料,算是可以做到发现问题并解决问题。

我的项目泄漏情况是这样的:

图1

满屏的红叉让人心慌,那么如何找到泄露的位置呢?

首先要选中满是红叉的那一行,然后在这里

图2

选中Call Tree,

在右边

图3

选中Invert Call Tree 和 Hide System Libraries 两项,Invert Call Tree 的意思是翻转调用树,意思就是我们在调用函数时,是一层一层的,调用外层函数会一直进入内层,直到最后一层,有点递归的意思,当选中 Invert Call Tree 选项时,会直接显示内层函数,方便我们去寻找,否则会直接显示最外层的函数,我们需要将其一层一层展开,比较费劲,不直观。

而Hide System Libraries 的意思很明显了。就是隐藏系统类库,避免一些莫名其妙的,我们无法改动的信息迷惑我们。

那么接下来我们将看到泄漏列表:

图4

看到这里我震惊了,强大的AFNetworking也会存在泄露?

让我们再看看具体是哪里除了问题,双击那一行我们就可以进入到具体泄漏的那个函数

图5

可以看到每一行泄漏的byte大小都标了出来,其中蓝色的为最大。

这里就要思考一个问题了,AFNetworking内部的这些代码我们怎么改呢?

不必担心,我们发现问题出在这个方法

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

一直以来,我都以为这是一个manager是单例,带你进去一看其实不然,

图6

每次调用时都会创建一个新的对象,那么问题又来了,创建就创建呗,难道执行之后,还会不释放?

查阅资料后果真如此,我们使用的 AFHTTPSessionManager 继承自 AFURLSessionManager ,

创建对象时会调用傅父类的方法。

图7

点进去看,发现其强引用一个NSURLSession对象

图8

并且将自己设置为了NSURLSession对象的代理


图9

NSURLSession又是强引用代理


图10

这样便造成了循环引用,彼此谁也释放不了。

那么如何解决呢?

这里提供两种策略

(一)NSURLSession提供两个方法:

图11

这个方法会立刻取消当前任务,session对象被释放。那么循环引用不复存在。

图12

而finishTasksAndInvalidate方法,则会等待任务完成时将session释放,消除了循环引用。

我们可以在success 和 failure block中调用这两个方法,个人推荐使用finishTasksAndInvalidate。

(二)像AFNetworking 3.0 提供的DEMO中,是这么用的:

创建一个继承自NSHTTPSessionManager的类,实现单例方法。

图13

然后在自己封装的网络层中修改。

相关文章

  • iOS 使用Leak进行内存泄漏的分析

    第一次使用Leak对项目进行内存泄漏的检测,也是查阅了许多资料,算是可以做到发现问题并解决问题。 我的项目泄漏情况...

  • 内存泄漏&内存溢出

    内存泄漏(memory leak) 申请了内存使用完毕后,并没有进行释放,这些未释放的内存称之为内存泄漏。 举个例...

  • 内存泄漏

    内存问题的可能情况 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏...

  • 【Android测试】内存泄漏检测 LeakCanary

    什么是内存泄漏和内存溢出?内存泄漏有什么危害?LeakCanary检测内存泄漏? 内存泄漏(Memory Leak...

  • 内存泄漏是什么??

    什么是内存泄漏(memory leak)? 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非...

  • 内存泄漏 简述

    内存泄漏 Q什么是内存泄漏? 内存泄漏memory leak,指原本应该被gc回收的对象还被另一个正在使用的对象引...

  • JavaScript内存泄漏

    查看github原文 什么是内存泄漏(Memory Leak) 内存泄漏可以简单地被认为没有被应用所使用,但也没有...

  • Xcode instruments工具检测内存泄露不显示方法名

    有时候我们为了检测内存泄漏,使用instruments的Leak工具,但是检测到内存泄漏后,显示的都是地址,却没办...

  • 内存泄漏

    什么是内存泄漏引起内存泄漏的原因野指针,空指针,僵尸对象 1.什么是内存泄漏 内存泄漏(Memory Leak)是...

  • instruments(02)之Allocations(内存分配

    此篇文章对allocations使用进行详细介绍,主要是为接下来要讲的内存泄漏(leak)做铺垫。关于instru...

网友评论

  • 040bc146a56b:您好,使用af3.1我这里并没有解决泄漏问题
  • 小草先生:点个赞先,最新用Leak检查代码也发现 AFN框架封装的网络请求类有泄漏 最后用Swift写了单例,虽然不知为何AFN作者不把代理置为weak。或许为何防止TCP每次都建立连接。保持连接状态吧。Xcode8 Leak界面改了 勾选 hide system lib,invert 显示的是某个内存,显示不了具体代码,点击进入汇编 也不知为何
    清风明月伴我行:是的,怎么显示具体代码啊 知道了没
  • liyc_dev:某些情况下单利会不会更好点?这样可以保持与服务端的keep-alive。使网络请求更快些。
    逆光少年:还是不懂怎么分析,我双击内存泄露的那一行进入到具体泄漏的那个函数是main函数,怎么分析?
    liyc_dev:@晴天WJ 我也在学习中,请教了。那是不是每个对象都会重新链接呢?
    晴天WJ:如果说每一个对象都会重新与服务器进行http连接,那么单例确实节省了建立连接的时间

本文标题:iOS 使用Leak进行内存泄漏的分析

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