偶得前言

本篇文章中我們主要談?wù)凬STimer\CADisplayLink在使用過程中牽扯到內(nèi)存泄露的相關(guān)問題及解決思路(文章末尾會(huì)附上Demo),有時(shí)候我們在不知情的情況容易入坑,最關(guān)鍵你還不知道自己掉坑了,閑話不多說,讓我們開始進(jìn)入正題。

NSRunLoop與定時(shí)器

我們先來回顧一下NSRunLoop對NSTimer\CADisplayLink的影響。(為了方便,以下統(tǒng)稱定時(shí)器)

大家都知道定時(shí)器的運(yùn)行需要結(jié)合一個(gè)NSRunLoop(有疑惑的同學(xué)可以查看Xcode Document,此處不細(xì)說),同時(shí)NSRunLoop對該定時(shí)器會(huì)有一個(gè)強(qiáng)引用,這也是為什么我們不對NSRunLoop中的定時(shí)器進(jìn)行強(qiáng)引的原因(如:self.timer = timer, 此代碼可省略)。

- invalidate的作用

由于NSRunLoop對定時(shí)器有著牽引,那么問題就來了,那么定時(shí)器怎樣才能被釋放掉呢(先不考慮使用removeFromRunLoop:),此時(shí)- invalidate函數(shù)的作用就來了,我們來看看官方就此函數(shù)的介紹:

Removes the object from all runloop modes (releasing the receiver if it has been implicitly retained) and releases the 'target' object.

據(jù)官方介紹可知,- invalidate做了兩件事,首先是把本身(定時(shí)器)從NSRunLoop中移除,然后就是釋放對‘target’對象的強(qiáng)引用。從而解決定時(shí)器帶來的內(nèi)存泄露問題。

內(nèi)存泄露在哪?

看到這里我們可能會(huì)有點(diǎn)懵逼,先上一個(gè)圖(為了方便講解,途中箭頭指向誰就代表強(qiáng)引誰):

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式