-
背景:
昨晚老大問我下面那段代碼是否存在內(nèi)存泄漏,如圖:
我拍著胸膛說歼捐,沒有!可是另外一個(gè)同事晨汹,很肯定的說有豹储,把self改成strongself就好了,后面我看他們測(cè)試淘这,總是測(cè)不出個(gè)所以然來剥扣,我就自己來測(cè)了。
說明一下:block內(nèi)存泄漏只有一種情況铝穷,self持有了block钠怯,block持有了self
可是這里很明顯,self沒有持有block氧骤,這個(gè)block是類方法的block呻疹,所以不存在內(nèi)存泄漏。但是用instrument檢測(cè)筹陵,這里確實(shí)存在內(nèi)存泄漏,我就很奇怪镊尺,點(diǎn)到這個(gè)方法里去看朦佩,如下圖:
網(wǎng)上一搜,一大片關(guān)于AFNetworking 3.x [AFHTTPSessionManager manager]; 內(nèi)存泄漏的解決方法庐氮。
-
產(chǎn)生原因
點(diǎn)進(jìn)[AFHTTPSessionManager manager]看看语稠,如下圖1、2弄砍、3仙畦、4個(gè)步驟定位:
最后一步點(diǎn)進(jìn)去看,如下圖:
發(fā)現(xiàn)delegate的修飾符跟我們平時(shí)用的有啥不一樣音婶?對(duì)慨畸,它是retain了,所以創(chuàng)建的self.session這個(gè)變量永遠(yuǎn)不會(huì)被銷毀衣式,從而導(dǎo)致AFHTTPSessionManager 這個(gè)類不會(huì)被銷毀寸士,蘋果官方有給出相應(yīng)的解決方法檐什,請(qǐng)接著看。
-
解決方法
方法一:寫單例
網(wǎng)上主流做法把[AFHTTPSessionManager manager]寫成單例弱卡,沒法釋放那我就不釋放了乃正,反正都要用到。步驟:
-
寫一個(gè)類SessionManager婶博,繼承自AFHTTPSessionManager
剛出問題的代碼就改成
這樣一跑Instrument就沒紅點(diǎn)點(diǎn)了瓮具,內(nèi)存泄漏完美解決,但是這里還有一個(gè)問題凡人,我這邊改了manager.responseSerializer搭综,因?yàn)槭菃卫麓我粋€(gè)Post請(qǐng)求要求返回Json格式的這個(gè)又要改回去划栓,所以這個(gè)要非常注意兑巾,要不然請(qǐng)求總會(huì)報(bào)錯(cuò)。不知道看的小伙伴針對(duì)這個(gè)問題有沒有更好的解決方法忠荞?
方法二:手動(dòng)釋放
這是官網(wǎng)給出的NSURLSession釋放的方法蒋歌,
看解釋,我們還是最好用第一個(gè)- (void)finishTasksAndInvalidate; 在success和failure的block中調(diào)用委煤,如下圖:
親測(cè)堂油,紅點(diǎn)點(diǎn)也消失了。
還有小伙伴有其他方法歡迎留言碧绞。