国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Leak 內存泄漏檢測

2019-11-07 23:56:52
字體:
來源:轉載
供稿:網友

第一次使用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

然后在自己封裝的網絡層中修改。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 诸城市| 镶黄旗| 莲花县| 舞钢市| 类乌齐县| 鄯善县| 金塔县| 惠东县| 盘山县| 利辛县| 康定县| 万安县| 尼玛县| 山东省| 宜章县| 苍梧县| 隆昌县| 桃源县| 会昌县| 扎鲁特旗| 湄潭县| 台前县| 大同市| 正蓝旗| 靖江市| 赤壁市| 民丰县| 怀安县| 松江区| 东宁县| 吐鲁番市| 墨竹工卡县| 绵竹市| 景泰县| 松原市| 榆林市| 汉中市| 务川| 徐州市| 湘阴县| 老河口市|