偶得前言
本篇文章中我們主要談談NSTimer\CADisplayLink在使用過程中牽扯到內存泄露的相關問題及解決思路(文章末尾會附上Demo),有時候我們在不知情的情況容易入坑,最關鍵你還不知道自己掉坑了,閑話不多說,讓我們開始進入正題。
NSRunLoop與定時器
我們先來回顧一下NSRunLoop對NSTimer\CADisplayLink的影響。(為了方便,以下統(tǒng)稱定時器)
大家都知道定時器的運行需要結合一個NSRunLoop(有疑惑的同學可以查看Xcode Document,此處不細說),同時NSRunLoop對該定時器會有一個強引用,這也是為什么我們不對NSRunLoop中的定時器進行強引的原因(如:self.timer = timer, 此代碼可省略)。
- invalidate的作用
由于NSRunLoop對定時器有著牽引,那么問題就來了,那么定時器怎樣才能被釋放掉呢(先不考慮使用removeFromRunLoop:),此時- invalidate函數(shù)的作用就來了,我們來看看官方就此函數(shù)的介紹:
Removes the object from all runloop modes (releasing the receiver if it has been implicitly retained) and releases the 'target' object.
據官方介紹可知,- invalidate做了兩件事,首先是把本身(定時器)從NSRunLoop中移除,然后就是釋放對‘target’對象的強引用。從而解決定時器帶來的內存泄露問題。
內存泄露在哪?
看到這里我們可能會有點懵逼,先上一個圖(為了方便講解,途中箭頭指向誰就代表強引誰):
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結合數(shù)據結構來看看(二) 2017-07-26
