第一次使用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 正文記憶體洩漏檢測 一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶...