iOS內存泄漏的檢測與修復(AFNetWorking內存泄漏)

什么是內存泄漏

內存泄漏就是你申請了一份內存萍程,但是由于某種原因骏庸,程序未釋放或無法釋放,造成系統(tǒng)內存的浪費。

造成內存泄漏原因是什么

現(xiàn)在一般都是ARC環(huán)境褐澎,所以造成內存泄漏的原因主要是強引用循環(huán),還有就是添加的一些觀察者沒有解除觀察这吻。

如何發(fā)現(xiàn)內存泄露

即使我們在編寫程序的時候格外注意了琳轿,但還是無法100%保證我們代碼沒有造成內存泄漏,這時候怎么檢測呢转培?不要慌恶导,蘋果還是很貼心的,Xcode給我們提供一系列的開發(fā)工具浸须,其中Leaks就是用來檢測內存泄漏的惨寿。

如何使用Leaks

工具通過Xcode工具欄中Product->Profile(command+i)或者通過Xcode->Open Developer Tool->Instruments開打Instruments


20200331151146923.png

找到Leaks并打開,然后點擊右上角紅色按鈕運行删窒;
然后把玩你的App裂垦,在內存泄漏的地方,會有紅色的X標記肌索,此時點擊左上角暫停蕉拢;


20200331154134309.png

我們選擇左側Leaks,下面控制臺的菜單欄也選擇Leaks(默認是Run Issue)诚亚,然后選擇Call Tree晕换。如圖


20200331154243495.png

最下面Call Tree勾選Invert Call Tree和Hide System Libraries


20200331152553457.png

(注:如果做完這幾步,控制臺依然沒有顯示相關代碼站宗,我們打開Xcode->TARGETS->Build Settings搜索Debug Information Format届巩,將debug和release都設置為DWARF with dSYM File即可)

這里有兩處內存泄漏的地方,我們要分別查看的話份乒,可以鼠標點擊X的左邊恕汇,然后拖動腕唧,選中X的區(qū)域。然后控制臺就會出現(xiàn)內存泄漏的相關代碼瘾英,雙擊會定位到代碼的位置枣接。點擊右上角xcode小圖標會在xcode里面打開。如下圖缺谴,不僅標記了位置但惶,還注明了泄漏的內存大小。


2020033115360570.png

經(jīng)過排查我們發(fā)現(xiàn)所有的內存泄漏都是AFNetWorking造成的湿蛔。這并不是檢測方法不對膀曾,而是AFNetWorking確實存在內存泄漏。我們仔細看這段代碼阳啥。
這里的self是AFURLSessionManager添谊,self強引用了session,而self作為delegate傳給了session察迟。我們點擊sessionWithConfiguration:delegate: delegateQueue:方法后發(fā)現(xiàn)斩狱,蘋果為了確保網(wǎng)絡數(shù)據(jù)的正常使用,session對他的delegate是強引用扎瓶。也就是self與session相互強引用所踊。
我們都知道代理需要用弱引用,但是這里破例用了強引用概荷,所以造成強引用循環(huán)秕岛,導致無法釋放。


20200331160109624.png

官方的文檔里解釋了為什么會強引用代理误证,也給出如何解決這個強引用循環(huán)的問題瓣蛀。

If you do not invalidate the session by calling the invalidateAndCancel or finishTasksAndInvalidate method, your app leaks memory until it exits.

意思就是我們可以通過調用invalidateAndCancel或者finishTasksAndInvalidate這兩個方法來釋放session

于是我們代碼改成

NSURLSession *session = self.sessionManager.session; 
NSURLSessionDataTask *dataTask = [self.sessionManager GET:url parameters:self.params progress:^(NSProgress * _Nonnull downloadProgress) {

} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"請求成功:\n%@",responseObject);
    [session finishTasksAndInvalidate];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"請求失敗:\n%@",error);
    [session finishTasksAndInvalidate];
}];
    [dataTask resume];

改完之后再次通過Leaks檢測雷厂,看到一片綠惋增,心情一下舒暢許多


20200331160949619.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市改鲫,隨后出現(xiàn)的幾起案子诈皿,更是在濱河造成了極大的恐慌,老刑警劉巖像棘,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽亏,死亡現(xiàn)場離奇詭異,居然都是意外死亡缕题,警方通過查閱死者的電腦和手機截歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烟零,“玉大人瘪松,你說我怎么就攤上這事咸作。” “怎么了宵睦?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵记罚,是天一觀的道長。 經(jīng)常有香客問我壳嚎,道長桐智,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任烟馅,我火速辦了婚禮说庭,結果婚禮上,老公的妹妹穿的比我還像新娘郑趁。我一直安慰自己刊驴,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布穿撮。 她就那樣靜靜地躺著,像睡著了一般痪欲。 火紅的嫁衣襯著肌膚如雪悦穿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天业踢,我揣著相機與錄音栗柒,去河邊找鬼。 笑死知举,一個胖子當著我的面吹牛瞬沦,可吹牛的內容都是我干的。 我是一名探鬼主播雇锡,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼逛钻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锰提?” 一聲冷哼從身側響起曙痘,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎立肘,沒想到半個月后边坤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谅年,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年茧痒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融蹂。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡旺订,死狀恐怖弄企,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情耸峭,我是刑警寧澤桩蓉,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站劳闹,受9級特大地震影響院究,放射性物質發(fā)生泄漏。R本人自食惡果不足惜本涕,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一业汰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菩颖,春花似錦样漆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呻右,卻和暖如春跪妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背声滥。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工眉撵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人落塑。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓纽疟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憾赁。 傳聞我的和親對象是個殘疾皇子污朽,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內容

  • 內存泄漏的相關定義 OC當中內存管理方式:ARC/MRCARC:自動引用計數(shù)(系統(tǒng)自動管理內存),由開發(fā)人員開辟內...
    騎老虎喊救命閱讀 3,116評論 0 2
  • 歡迎訪問我的博客原文 內存泄漏指的是程序中已動態(tài)分配的堆內存(程序員自己管理的空間)由于某些原因未能釋放或無法釋放...
    FiTeen閱讀 2,678評論 1 5
  • 本文源自本人的學習記錄整理與理解龙考,其中參考閱讀了部分優(yōu)秀的博客和書籍膘壶,盡量以通俗簡單的語句轉述。引用到的地方如有遺...
    水中的藍天閱讀 779評論 0 3
  • 本文將從以下兩個層面解決iOS內存泄漏問題: 內存泄漏排查方法(工具) 內存泄漏原因分析(解決方案) 在正式開始前...
    齊舞647閱讀 905評論 0 7
  • 內存溢出 (out of memory):是指程序在申請內存時洲愤,沒有足夠的內存空間供其使用颓芭,出現(xiàn)out of me...
    th先生閱讀 1,816評論 0 4