很多iOS開發的朋友都是比較關心記憶體泄漏的問題,在實際的開發工作中首先我們需要知道程式有沒有記憶體泄露,然後定位到底是哪行代碼出現記憶體泄露了,這樣才能將其修複。最簡單的方法當然是藉助於專業的檢測工具,比較有名如BoundsCheck工具,功能非常強大。 記憶體的泄漏是會關係到線上的穩定性和性能。記憶體泄露 ...
很多iOS開發的朋友都是比較關心記憶體泄漏的問題,在實際的開發工作中首先我們需要知道程式有沒有記憶體泄露,然後定位到底是哪行代碼出現記憶體泄露了,這樣才能將其修複。最簡單的方法當然是藉助於專業的檢測工具,比較有名如BoundsCheck工具,功能非常強大。
記憶體的泄漏是會關係到線上的穩定性和性能。記憶體泄露將會是導致這樣的情況發生:
1.若是記憶體資源不足發生難以排查的線上bug
2.被泄露對象的存在,將會是導致的一些業務bug,例如是泄露的對象它們是仍在接受全局的一個通知
3.一些性能問題,是會導致用戶使用app時越來越卡
記憶體泄露發現分成靜態掃描和運行時檢測,本文主要講運行時檢測。
關於靜態掃描
常用的一些靜態掃描的工具:
xcode analyzer
OCLint
Infer
運行時動態檢測
因為在靜態掃描不能發現所有的記憶體泄露問題,因此在運動時檢測,是必不可少的一個操作。
Allocation
Xcode中的的Allocation是可以通過比較不同時間段的對象,用來是分析出是否發生了一些記憶體泄露。前提必須是每個頁面的命名要符合規範,就比如說寶貝詳情頁的所有對象,這些都是應用的首碼+寶貝詳情頁面首碼+具體對象名,當退出頁面的時候才會是知道相應的對象是否被釋放了,那是因為stack最底部的頁面的對象經常是駐在記憶體中。
Allocation是通過和Monkey配合,當在回歸測試的時候,會自動運行並通過計算記憶體占用率,就可以判斷出新的開發版本是否發生了記憶體泄露,但是無法知道具體是哪個對象沒有釋放,局限性就是只能通過全局的一個判斷。
重點是如何排查?
當發現了記憶體泄露後,排查並解決,這才是最關鍵的一步。開發者是根據泄露的對象,重點的去排查block和兩個以上對象迴圈引用的最終情況。
發現是ViewController發生記憶體泄露,就要是重點的去查看一下ViewController裡面的block是否忘記聲明weak了,當ViewController被其他對象持有的情況不常見。因此若是用RAC的話,這就要去記得weakly和strongly要成對出現,否則將會是發生記憶體的泄露。
實際上最常發生的是View的記憶體泄露問題,首先查看是發生記憶體泄露的view之間是否有delegate的關係,若有,則去看delegate屬性有沒有聲明weak,一般的由於service或者讀取緩存等非同步操作引起的記憶體泄露問題。
解決記憶體泄漏的問題最主要的還是在編碼的時候儘量的做到規範一些,學會利用工具去排查是積累經驗的有效手段,靜態掃描能解決一部分問題,動態掃描是最後的保證。