iOS常見內(nèi)存泄露匯總

一.定時(shí)器 NSTimer CADisplayLink

原因:VC或View持有該控制器,同時(shí)傳入self作為定時(shí)器的target,此時(shí)定時(shí)器內(nèi)部也會(huì)持有這個(gè)self.

例如:

如果需求無(wú)主動(dòng)停止定時(shí)器的情況,直接在dealloc中停止定時(shí)器.這種情況比較危險(xiǎn),易造成循環(huán)引用,定時(shí)器和控制器都無(wú)法釋放.

解決:可以使用3種方式

1.使用IKWeakTimer類方法創(chuàng)建NSTimer定時(shí)器,內(nèi)部已做弱引用處理

[IKWeakTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]

??????? 2.target使用WeakProxy

3.使用block方法,在block中處理事件


二.傳入控制器作為某個(gè)類的參數(shù)屬性(或是某一個(gè)其他類型對(duì)象),同時(shí)這個(gè)類又是這個(gè)控制器(或是其他類型的對(duì)象)的屬性,并且兩處都是用strong修飾的

原因:互相持有,在控制器退出后就無(wú)法釋放

例如:

外部傳入的viewController作為IKPhotoDelegeteModel的屬性,且為strong修飾

IKPhotoDelegeteModel在外部創(chuàng)建的時(shí)候也為作為外部ViewController的屬性,同為strong修飾

解決:可以根據(jù)需求對(duì)其中一個(gè)使用weak修飾

三.持有了一個(gè)單例對(duì)象的某個(gè)屬性,造成無(wú)法釋放,但不是循環(huán)引用

解決:謹(jǐn)慎使用或使用時(shí)復(fù)制一份

四.動(dòng)畫中使用CAAnimation動(dòng)畫沒有移除動(dòng)畫導(dǎo)致內(nèi)存泄露

原因:

CAAnimation的delegate系統(tǒng)是使用strong修飾符的,猜測(cè)是系統(tǒng)為了確保動(dòng)畫完成之前動(dòng)畫加載的View不會(huì)被提前釋放,所以在動(dòng)畫結(jié)束之后必須

及時(shí)在動(dòng)畫結(jié)束的地方或是在其他地方手動(dòng)移除動(dòng)畫

五.使用weak_self有遺漏

例如:

如果使用了weakify(self),又沒有使用strongify(self),下方應(yīng)該使用weak_self,檢查是否有遺漏

例如:

weakify對(duì)象使用錯(cuò)誤 此處造成循環(huán)引用的是alert? 應(yīng)該使用weakify(alert)

注意weakify和strongify的使用場(chǎng)景,一般情況下,如果需要確保block返回時(shí)self不被提前釋放繼續(xù)執(zhí)行,需要多次使用[self xxxxx],需要使用strongify;如果是一個(gè)頁(yè)面

銷毀了,可以不再繼續(xù)執(zhí)行block中代碼的情況,可以不用strongify修飾,因?yàn)闆]有必要繼續(xù)執(zhí)行[self xxxxxx];

如果是兩個(gè)block循環(huán)嵌套,需要使用兩層weakify和strongify

六:使用window不當(dāng)導(dǎo)致的內(nèi)存泄露

在Bugly上發(fā)現(xiàn)了大量iOS9系統(tǒng)下的崩潰,崩潰信息無(wú)法明顯看出具體原因。

查看操作路徑后發(fā)現(xiàn)基本都是有進(jìn)行window的操作。

使用真機(jī)調(diào)試后(iPhone4s iOS9)后,通過(guò)內(nèi)存圖發(fā)現(xiàn)window引起了內(nèi)存泄露


dismiss里面手動(dòng)釋放一下


七 :NSThread 造成的內(nèi)存泄漏

?當(dāng)想創(chuàng)建一個(gè)常駐線程的時(shí)候 ,會(huì)將NSThread 和 RunLoop 結(jié)合使用,這時(shí)候會(huì)有循環(huán)引用問(wèn)題


因?yàn)楫?dāng)前runLoop調(diào)用了run方法后,因?yàn)镹SRunLoop不會(huì)停止,同時(shí)開啟了一個(gè)常駐的不會(huì)銷毀的線程,而線程創(chuàng)建的時(shí)候也會(huì)對(duì)當(dāng)前對(duì)象(self)進(jìn)行強(qiáng)引用,所以造成了(self)不會(huì)被釋放。解決方法是創(chuàng)建的時(shí)候使用Block的方式創(chuàng)建,或是創(chuàng)建完常駐線程后,主動(dòng)釋放不需要常駐的不相關(guān)對(duì)象

八 : 非OC對(duì)象

??????? 對(duì)于如下代碼中,所創(chuàng)建的變量為非OC對(duì)象,因?yàn)椴皇蹵RC管理,所以需要手動(dòng)執(zhí)行釋放操作,否則變量無(wú)法自動(dòng)釋放,造成內(nèi)存泄漏。主要有 CoreFoundation框架 、CoreGraphics框架,C語(yǔ)言代碼malloc等等?


九:swift代碼 同名對(duì)象情況下block持有不釋放
? ? ? ? ?對(duì)于如下圖代碼,有一個(gè)viewModel的屬性和一個(gè)同名的臨時(shí)變量,這樣在block的代碼中,如果直接使用viewModel,這時(shí)候其實(shí)真實(shí)使用的是屬性的selfviewModel,但是卻沒有使用弱引用的self

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容