上文我們提到了檢測(cè)內(nèi)存泄漏的工具,下面我們就介紹一些常見(jiàn)的內(nèi)存泄漏問(wèn)題.
1. Block
關(guān)于 block 導(dǎo)致的循環(huán)引用問(wèn)題是本人遇到的最多的導(dǎo)致內(nèi)存泄漏的原因,相信大部分人可能都遇到過(guò).這里我們不再對(duì)其成因進(jìn)行一一贅述,只列幾項(xiàng)需要注意的地方:
某個(gè)類將 block 作為自己的屬性變量,然后該類在 block 的方法體里面又使用了該類本身(例:自定義 View,MJRefresh等).
一個(gè)單例持有的 block,并且 block 內(nèi)又使用了 ViewController 這個(gè)類.
如果方法中參數(shù)是 block 或一些系統(tǒng)的 block 則不需要我們處理.
2. delegate
delegate 循環(huán)引用問(wèn)題只需注意將代理屬性修飾為 weak 即可.類似的可能有童鞋使用 superVC 這樣的屬性也都需要 weak.
3. NSTimer
我們都知道定時(shí)器使用完畢時(shí)需要將其停止并滯空,但是不要將這個(gè)時(shí)機(jī)放在 dealloc 里,會(huì)造成了互相等待的場(chǎng)景,無(wú)法釋放.
4. 非 OC 對(duì)象
CGImageRef(對(duì)應(yīng)調(diào)用CGImageRelease),CGContextRef(對(duì)應(yīng)調(diào)用CGContextRelease),CGColorSpaceRef(對(duì)應(yīng)CGColorSpaceRelease) 等,需要手動(dòng)釋放.
5. 踩過(guò)的其它坑
適時(shí)使用 autoReleasePool
一些系統(tǒng)的回調(diào)適時(shí)釋放(例:UIAlertController)
viewWillAppear 對(duì)應(yīng) viewWillDisappear,不是 back 方法,說(shuō)多了都是淚.