Leak 記憶體洩漏檢測

2021-07-27 10:42:06 字數 2105 閱讀 2145

第一次使用leak對專案進行記憶體洩漏的檢測,也是查閱了許多資料,算是可以做到發現問題並解決問題。

我的專案洩漏情況是這樣的:

滿屏的紅叉讓人心慌,那麼如何找到洩露的位置呢?

首先要選中滿是紅叉的那一行,然後在這裡

選中call tree,

在右邊

選中invert call tree 和 hide system libraries 兩項,invert call tree 的意思是翻轉呼叫樹

,意思就是我們在呼叫函式時,是一層一層的,呼叫外層函式會一直進入內層,直到最後一層,有點遞迴的意思,當選中 invert call tree 選項時,會直接顯示內層函式,方便我們去尋找,否則會直接顯示最外層的函式,我們需要將其一層一層展開,比較費勁,不直觀。

而hide system libraries 的意思很明顯了。就是隱藏系統類庫,避免一些莫名其妙的,我們無法改動的資訊迷惑我們。

那麼接下來我們將看到洩漏列表:

看到這裡我震驚了,強大的afnetworking也會存在洩露?

讓我們再看看具體是**除了問題,雙擊那一行我們就可以進入到具體洩漏的那個函式

可以看到每一行洩漏的byte大小都標了出來,其中藍色的為最大。

這裡就要思考乙個問題了,afnetworking內部的這些**我們怎麼改呢?

不必擔心,我們發現問題出在這個方法

一直以來,我都以為這是乙個manager是單例,帶你進去一看其實不然,

每次呼叫時都會建立乙個新的物件,那麼問題又來了,建立就建立唄,難道執行之後,還會不釋放?

查閱資料後果真如此,我們使用的 afhttpsessionmanager 繼承自 afurlsessionmanager ,

建立物件時會呼叫傅父類的方法。

點進去看,發現其強引用乙個nsurlsession物件

並且將自己設定為了nsurlsession物件的**

而nsurlsession又是強引用**

圖10

這樣便造成了迴圈引用,彼此誰也釋放不了。

那麼如何解決呢?

這裡提供兩種策略:

(一)nsurlsession提供兩個方法:

圖11

這個方法會立刻取消當前任務,session物件被釋放。那麼迴圈引用不復存在。

圖12

而finishtasksandinvalidate方法,則會等待任務完成時將session釋放,消除了迴圈引用。

我們可以在success 和 failure block中呼叫這兩個方法,個人推薦使用finishtasksandinvalidate。

(二)像afnetworking 3.0 提供的demo中,是這麼用的:

建立乙個繼承自nshttpsessionmanager的類,實現單例方法。

圖13

然後在自己封裝的網路層中修改。

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的reboot才會正常...

記憶體洩漏檢測

記憶體洩漏檢測 自己寫的 作者 很土 關鍵字 記憶體洩漏 記憶體 debug heap 堆 原作者姓名 很土 介紹簡單說明了一下沒有工具的情況如何運用vc庫中的工具來檢查 的記憶體洩漏問題 讀者評分 8 評分次數 2 正文記憶體洩漏檢測 一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶...