偶得前言
本篇文章中我們主要談?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)引誰):
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26