內(nèi)存泄漏就是應(yīng)該釋放而沒(méi)有釋放的內(nèi)存遣臼!
內(nèi)存溢出 out of memory:是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用拾并,出現(xiàn)out of memory暑诸;比如申請(qǐng)了一個(gè)integer,但給它存了long才能存下的數(shù)蚌讼,那就是內(nèi)存溢出
內(nèi)存泄露 memory leak:是指程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已申請(qǐng)的內(nèi)存空間个榕,一次內(nèi)存泄露危害可以忽略篡石,但內(nèi)存泄露堆積后果很?chē)?yán)重,無(wú)論多少內(nèi)存,遲早會(huì)被占光
memory leak會(huì)最終會(huì)導(dǎo)致out of memory西采!
以發(fā)生的方式來(lái)分類(lèi)凰萨,內(nèi)存泄漏可以分為4類(lèi):
- 常發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏
- 偶發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過(guò)程下才會(huì)發(fā)生械馆。常發(fā)性和偶發(fā)性是相對(duì)的胖眷。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的霹崎。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要
- 一次性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次珊搀,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏尾菇。比如境析,在類(lèi)的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒(méi)有釋放該內(nèi)存派诬,所以內(nèi)存泄漏只會(huì)發(fā)生一次
- 隱式內(nèi)存泄漏:程序在運(yùn)行過(guò)程中不停的分配內(nèi)存劳淆,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說(shuō)這里并沒(méi)有發(fā)生內(nèi)存泄漏默赂,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存沛鸵。但是對(duì)于一個(gè)服務(wù)器程序,需要運(yùn)行幾天缆八,幾周甚至幾個(gè)月曲掰,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以奈辰,我們稱(chēng)這類(lèi)內(nèi)存泄漏為隱式內(nèi)存泄漏
影響:從用戶使用程序的角度來(lái)看栏妖,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害,作為一般的用戶冯挎,根本感覺(jué)不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積咙鞍,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存
內(nèi)存泄漏檢測(cè)
內(nèi)存泄漏檢測(cè)方法常用的兩種方式是用Xcode自帶的 Instruments Leaks 和 內(nèi)存管理器Analyze兩種方式
-
Analyze靜態(tài)分析:打開(kāi)項(xiàng)目房官,點(diǎn)擊Product->Analyze,進(jìn)入靜態(tài)分析续滋,結(jié)果如下
Instruments Leak - 01.png
根據(jù)提示信息一一排查問(wèn)題翰守,靜態(tài)內(nèi)存泄漏分析能發(fā)現(xiàn)大部分問(wèn)題,但只是靜態(tài)分析并不準(zhǔn)確疲酌,只是有可能發(fā)生內(nèi)存泄漏蜡峰,動(dòng)態(tài)內(nèi)存分配的情況沒(méi)有排查了袁,畢竟某些頁(yè)面的交互操作需要用戶去做某些操作時(shí)才會(huì)發(fā)生內(nèi)存泄漏,下面我們就著重說(shuō)一下動(dòng)態(tài)內(nèi)存泄漏分析 Instruments Leaks -
Instruments Leaks動(dòng)態(tài)分析:有三種打開(kāi)Instruments的方式
-
通過(guò)Xcode->Open Developer Tool->Instruments
Instruments Leak - 02.png -
通過(guò)Product->Profile
Instruments Leak - 03.png - 通過(guò)長(zhǎng)按啟動(dòng)->Profile
Instruments Leak - 04.png
啟動(dòng)成功后我們選擇Leaks湿颅,進(jìn)入檢測(cè)
Instruments Leak - 05.png
Instruments Leak - 06.png
在上面選擇運(yùn)行設(shè)備载绿,之后選擇想要檢測(cè)的項(xiàng)目,點(diǎn)擊左面紅色按鈕運(yùn)行油航,檢測(cè)之前寫(xiě)了段有問(wèn)題代碼
Instruments Leak - 07.png
Instruments Leak - 08.png
當(dāng)出現(xiàn)上圖紅色叉叉表示有內(nèi)存泄漏崭庸,選擇Leak Checks,下圖左上角Leaks處選擇Call Tree谊囚,點(diǎn)擊下方Call Tree勾選Invert Call Tree和Hide System Libraries怕享,剩下的直觀就看到類(lèi)和方法
Instruments Leak - 09.png
Separate by Thread:每個(gè)線程被單獨(dú)考慮
Invert Call Tree:調(diào)用棧會(huì)自上至下顯示,字面意思就是反轉(zhuǎn)樹(shù)形結(jié)構(gòu)也很好理解
Hide System Libraries:只有你自己app中出現(xiàn)的符號(hào)會(huì)被顯示出來(lái)镰踏,隱藏系統(tǒng)庫(kù)
Flatten Recursion:該選項(xiàng)將每一個(gè)調(diào)用棧中的遞歸函數(shù)(調(diào)用它們自身的函數(shù))視作單一入口函筋,而不是多入口
其中可能有同學(xué)沒(méi)有顯示類(lèi)名方法名,不要急奠伪,那是因?yàn)閄code的配置問(wèn)題跌帐,找到Build Setting->Debug information Format,把Debug和Release都改成DWARF with dSYM File芳来,然后重新啟動(dòng)項(xiàng)目和Leaks即可
Instruments Leak - 10.png
雙擊查看詳情含末,就是剛才寫(xiě)的問(wèn)題代碼,對(duì)應(yīng)做出修改解決問(wèn)題
Instruments Leak - 11.png
-
我的更多文章:你等下課滴
您可以關(guān)注我以便隨時(shí)查看我最新的文章即舌,本篇文章是為了做筆記佣盒,順便提供給大家共同學(xué)習(xí)進(jìn)步!如果您對(duì)本篇文章有任何疑問(wèn)顽聂,請(qǐng)留言給我肥惭,有什么錯(cuò)誤也可以留言提醒,如果對(duì)大家有幫助我很榮幸紊搪!感謝蜜葱!