一.定時(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
