在我們開發中經常會遇到BAD_ACCESS這樣的錯誤,不用想這就是記憶體洩漏,即使在現在ARC的大環境下,也會遇到記憶體過度釋放或是記憶體洩露的問題;
##下面介紹兩種方法來處理BAD_ACCESS: ————————————————————————————— 方案一:
使用Xcode自帶的Instrument,長這個樣子的:
假設現在有一段程式碼存在記憶體洩漏的問題,使用這個工具的步驟如下:
1.設定殭屍物件 (作用是:假設有個物件記憶體被釋放了,但是你想找到問題所在,這個物件就會讓這個物件的記憶體不會被釋放,就像活死人一樣,但是切記,解決問題以後,一定要把殭屍物件去掉,不然會遇到很多莫名其妙的Bug)
如圖所示 開啟scheme:
- 開啟以後介面是這個樣子的,我們使用Instrument 找記憶體洩漏就需要配合殭屍物件,所以接下來我們需要設定殭屍物件;
2.如圖所示 通過這種方式 開啟Instrument
3.開啟的介面是這樣的,按照圖中所示進行選擇:
4.進入這樣的介面,按照圖中所示,進行操作:
然後你就會看到這個程式執行起來後的樣子,如圖所示:
點選你的模擬器 要出問題的地方,把程式搞崩潰,返回到Instrument中,按照下圖進行操作:
點了這個箭頭進去以後,注意到了麼? 有變灰色的行出現了,這就是我們出問題的地方,雙擊這一行進去,就可以定位到我們出問題的地方了:
這裡的例子就是因為,二級頁面中沒有移除通知,導致雖然二級頁面pop以後,頁面雖然沒有了,但是這個物件始終沒有釋放掉,仍有一個物件持有他,這就比較尷尬了,就會出現野指標,導致記憶體問題,不論是ARC還是MRC,都要記住,誰汙染誰處理,物件的引用計數為0,才能得到釋放;
—————————————————————————————
方案二:
使用終端命令列加schme的方式進行尋找;
還是使用上面那個例子喲~
- 編輯scheme,如圖所示:
2.注意到了麼?如下圖,你的控制檯多了點東西,兩個箭頭指的東西都是一樣的,我們需要的是前面的那個程式的pid,如1527;
3.執行你的程式,讓它崩潰,在這個例子中,崩潰以後會在控制檯輸出這樣一句話:
message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是這個物件
複製程式碼
4.使用終端,查詢問題:
輸入:sudo malloc_history 1527 0x7ff8fdd2f9c0
第一輸入,會讓你輸入這臺電腦的密碼,輸入就是了,沒有關係的;
複製程式碼
5.結尾,是不是和上面我們用Instrument找到的同一個地方呢?一般出問題的程式碼都在| _objc_rootAlloc | class_createInstance | calloc | malloc_zone_calloc 這些程式碼的前面
—————————————————————————————
##補充:
1.寫通知 和 NSTimer記住要釋放,Block中解決迴圈引用。
2.全域性斷點:
3.庫檔案衝突的時候記住:
要麼重新pod 要麼刪掉重複的 要麼在other link flag刪掉重複的 要麼在搜尋框搜尋重複的 再刪除重複的(比如環信帶音視訊框架和B站框架一起 匯入 就會出現這種問題 或者專案已經有MJRefresh 等 再匯入環信 也會報重複庫檔案衝突)