日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析NSTimer CADisplayLink内存泄露

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析NSTimer CADisplayLink内存泄露 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

偶得前言

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

NSRunLoop與定時器

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

大家都知道定時器的運行需要結合一個NSRunLoop(有疑惑的同學可以查看Xcode Document,此處不細說),同時NSRunLoop對該定時器會有一個強引用,這也是為什么我們不對NSRunLoop中的定時器進行強引的原因(如:self.timer = timer, 此代碼可省略)。

- invalidate的作用

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

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

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

內存泄露在哪?

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

此處我們必須明確,在開發中,如果創建定時器只是簡單的計時,不做其他引用,那么timer對象與myClock對象循環引用的問題就可以避免(即省略self.timer = timer,前文已經提到過,不再闡述),即圖中箭頭5可避免。

雖然孤島問題已經避免了,但還是存在問題,因為myClock對象被UIViewController以及timer引用(timer直接被NSRunLoop強引用著),當UIViewController控制器被UIWindow釋放后,myClock不會被銷毀,從而導致內存泄露。

講到這里,有些人可能會說對timer對象發送一個invalidate消息,這樣NSRunLoop即不會對timer進行強引,同時timer也會釋放對myClock對象的強引,這樣不就解決了嗎?沒錯,內存泄露是解決了。

但是,這并不是我們想要的結果,在開發中我們可能會遇到某些需求,只有在myClock對象要被釋放時才去釋放timer(此處要注意釋放的先后順序及釋放條件),如果提前向timer發送了invalidate消息,那么myClock對象可能會因為timer被提前釋放而導致數據錯了,就像鬧鐘失去了秒針一樣,就無法正常工作了。所以我們要做的是在向myClock對象發送dealloc消息前在給timer發送invalidate消息,從而避免本末倒置的問題。這種情況就像一個死循環(因為如果不給timer發送invalidate消息,myClock對象根本不會被銷毀,dealloc方法根本不會執行),那么該怎么做呢?

我們如何解決?

現在我們已經知道內存泄露在哪了,也知道原因是什么,那么如何解決,或者說怎樣優雅的解決這問題呢?方式有很多.
a.NSTimer Target

為了解決timer與myClock之間類似死鎖的問題,我們會將定時器中的‘target’對象替換成定時器自己,采用分類實現。

#import?"NSTimer+TXTimerTarget.h"@implementation?NSTimer?(TXTimerTarget)+?(NSTimer?*)tx_scheduledTimerWithTimeInterval:(NSTimeInterval)interval?repeat:(BOOL)yesOrNo?block:(void?(^)(NSTimer?*))block{????return?[self?scheduledTimerWithTimeInterval:interval?target:self?selector:@selector(startTimer:)?userInfo:[block?copy]?repeats:yesOrNo]; }+?(void)startTimer:(NSTimer?*)timer?{????void?(^block)(NSTimer?*timer)?=?timer.userInfo;????if?(block)?{block(timer);} }@end

b.NSTimer Proxy

這種方式就是創建一個NSProxy子類TXTimerProxy(不太清楚NSProxy的同學可以去查一下相關資料哈),TXTimerProxy的作用是什么呢?就是什么也不做,可以說只會重載消息轉發機制,如果創建一個TXTimerProxy對象將其作為timer的‘target’,專門用于轉發timer消息至myClock對象,那么問題是不是就解決了呢?答案:是的。

NSTimer?*timer?=?[NSTimer?scheduledTimerWithTimeInterval:0.25?target:[TXTimerProxy?timerProxyWithTarget:self]?selector:@selector(startTimer)?userInfo:nil?repeats:YES];[[NSRunLoop?currentRunLoop]?addTimer:timer?forMode:NSRunLoopCommonModes];self.timer?=?timer;

實現詳情文章末尾會附上Demo,感興趣的同學可以去看看哈,有什么問題可以直接問,互相交流。

c.NSTimer Block

還有一種方式就是采用Block,iOS 10增加的API。

+?scheduledTimerWithTimeInterval:repeats:block:

The execution body of the timer; the timer itself is passed as the parameter to this block when executed to aid in avoiding cyclical references

有點類似a方式,此處不再詳述。

//NSTimer?Block(解決self內存泄露)?模擬器會崩潰//API_AVAILABLE(macosx(10.12),?ios(10.0),?watchos(3.0),?tvos(10.0));NSTimer?*timer?=?[NSTimer?scheduledTimerWithTimeInterval:0.25?repeats:YES?block:^(NSTimer?*?_Nonnull?timer)?{????NSLog(@"TXNSTimerBlockController?timer?start"); }];[[NSRunLoop?mainRunLoop]?addTimer:timer?forMode:NSRunLoopCommonModes];self.timer?=?timer;

此處以NSTimer舉例,CADisplayLink不再詳述(方式都是一樣)。




本文轉自lzwxx 51CTO博客,原文鏈接:http://blog.51cto.com/13064681/1943387

總結

以上是生活随笔為你收集整理的浅析NSTimer CADisplayLink内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美综合成人 | 性开放淫合集 | 天堂网亚洲 | 美女国产免费 | 不卡视频免费在线观看 | 国产视频在线免费观看 | 蜜桃综合网 | 精品免费在线 | 无码不卡av东京热毛片 | 啪啪.com | www.奇米 | 无遮挡裸光屁屁打屁股男男 | 操你啦在线视频 | 青青伊人av | 欧美xxxx日本和非洲 | 丁香花电影免费播放在线观看 | 五月天国产视频 | 日韩精品免费一区二区 | 国产色站 | 国内成人自拍视频 | 波多野结衣三区 | 色香欲综合网 | 亚洲天堂成人网 | 国产麻豆一精品一av一免费 | 成人在线免费电影 | 欧美疯狂做受 | 一区二区日韩视频 | av男人在线| 成年人视频在线免费看 | 无码少妇一区二区三区芒果 | 国产午夜精品无码 | 亚洲天堂网在线观看视频 | 中文字幕日韩精品一区 | 国产7777777| melody在线高清免费观看 | 亚洲黄页 | 简单av网| 一区二区三区视频在线观看免费 | 色花堂在线 | 欧美精品一区二区三区在线 | 在线一区二区三区四区 | 91碰碰| 天天天天干 | 高清欧美性猛交 | 福利在线影院 | 99精品国自产在线 | 99精品国自产在线 | 日韩中文字幕免费视频 | 欧美不卡影院 | 国家队动漫免费观看在线观看晨光 | 精品一区二区在线播放 | 麻豆av毛片 | 公肉吊粗大爽色翁浪妇视频 | 中文字幕av影片 | 青青视频免费看 | 亚洲一区电影 | 久久伊人草 | 午夜精品一区二区三区三上悠亚 | 免费av日韩 | 欧美少妇b| 偷拍一区二区三区四区 | 秋霞一级全黄大片 | 99色综合网 | 成人免费国产 | 伊人成长网| 久久精品国产99 | 精品国产乱码久久久久久闺蜜 | 91成人在线免费视频 | 日本少妇在线观看 | 深夜成人福利 | 成年人黄色小视频 | 成人熟女一区二区 | 丝袜美女啪啪 | 中文字幕无码精品亚洲 | 国产成人无码久久久精品天美传媒 | 欧美人妖老妇 | 欧美性视频一区二区三区 | 操操操日日日 | 国产三级理论片 | 五月天六月婷 | 日韩欧美一区二区三区免费观看 | 一级片日韩 | 中文字幕在线视频一区二区 | aaa成人 | 草草影院在线观看 | 57pao国产精品一区 | 日本在线h | 偷偷操99| 日本无翼乌邪恶大全彩h | 国产麻豆剧传媒精品国产av | 这里只有精品9 | 黄色片国产 | 齐天大性床战铁扇公主 | 福利网址在线观看 | 最近高清中文在线字幕在线观看 | 欧美老女人视频 | 久久9久久 | 丰满人妻一区二区三区免费视频 | 日韩小视频 |