UIViewController是我們?cè)趇OS開(kāi)發(fā)中用的最頻繁的類(lèi),是一個(gè)iOS app界面骨架,在mvc的框架下,v就是指UIViewController,幾乎所有的業(yè)務(wù)邏輯都在這里面完成,因此在這種模式下,UIViewController的代碼量比較大,進(jìn)而出現(xiàn)內(nèi)存泄漏的風(fēng)險(xiǎn)也比較大,因此很有必要在開(kāi)發(fā)的過(guò)程中,對(duì)其進(jìn)內(nèi)存泄漏的檢測(cè)。
內(nèi)存泄漏的工具有很多,Xcode就自帶了集中方式,例如analyze,instrument中的leaks,還有第三方工具M(jìn)LeakFinder等等。在檢測(cè)的時(shí)候,雖然不是100%能夠檢測(cè)出來(lái),但是大部分都是沒(méi)問(wèn)題的,本文就是在研究MLeakFinder第三方庫(kù)的基礎(chǔ)上,根據(jù)據(jù)自己的理解,自己寫(xiě)的一個(gè)關(guān)于UIViewController的自定義內(nèi)存檢測(cè)工具。
原理分析:
1、dispatch_after這個(gè)是GCD提供的一個(gè)延時(shí)處理事物的方式,只需要將延時(shí)的任務(wù)放到block中,設(shè)置好時(shí)長(zhǎng)即可,而我們將一個(gè)弱引用對(duì)象放到block中,不會(huì)影響對(duì)象的釋放,就有如下的代碼:

通常情況下,UIViewController的釋放都是在被UINavigationController pop或者presenter出來(lái)后自身dismiss這兩個(gè)時(shí)機(jī)后,而且一定會(huì)走viewDidDisappear這個(gè)方法,但是不是所有的viewWillDisappear都是這兩個(gè)時(shí)機(jī),所以需要區(qū)分標(biāo)記。

另外,為了做到不侵入式,需要用到分類(lèi),通過(guò)runtime動(dòng)態(tài)交換這些時(shí)機(jī)方法。
代碼實(shí)現(xiàn):
UINavigationController(HxwLeak)時(shí)機(jī)方式撲捉并處理:

UIViewController(HxwLeak) ?dismiss時(shí)機(jī)及處理延時(shí)任務(wù)

以上就是這些,具體見(jiàn)demo。