iOS 利用runtime自定義內(nèi)存檢測(cè)工具(UIViewController)

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ì)象的釋放,就有如下的代碼:

延時(shí)任務(wù)

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

標(biāo)記區(qū)分

另外,為了做到不侵入式,需要用到分類(lèi),通過(guò)runtime動(dòng)態(tài)交換這些時(shí)機(jī)方法。

代碼實(shí)現(xiàn):

UINavigationController(HxwLeak)時(shí)機(jī)方式撲捉并處理:

撲捉釋放時(shí)機(jī)


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

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


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

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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