NSTimer 銷毀問題 和 iOS中控制器的釋放問題


俗話說的好,前人栽樹后人乘涼,最近看了很多博文,不少博文提到了NSTimer的銷毀問題, 之前我都沒怎么注意,現在對照着文章一一實踐發現坑還真不少。下面是我讀到的幾篇博文分享給大家

@嘯笑天的NSTimer
@龐海礁的個人空間
@汪海的實驗室「iOS 中的 NSTimer」

這幾篇文章闡述了NSTimer的銷毀問題,並且都給出解決方案

這里就提供一個簡潔的方案,是由嘯笑天提供的

+ (NSTimer *)ez_scheduledTimerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats { void (^block)() = [inBlock copy]; NSTimer * timer = [self scheduledTimerWithTimeInterval:inTimeInterval target:self selector:@selector(__executeTimerBlock:) userInfo:block repeats:inRepeats]; return timer; } + (NSTimer *)ez_timerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats { void (^block)() = [inBlock copy]; NSTimer * timer = [self timerWithTimeInterval:inTimeInterval target:self selector:@selector(__executeTimerBlock:) userInfo:block repeats:inRepeats]; return timer; } + (void)__executeTimerBlock:(NSTimer *)inTimer; { if([inTimer userInfo]) { void (^block)() = (void (^)())[inTimer userInfo]; block(); } }

嘯笑天解決方案的github地址

https://github.com/easyui/EZToolKit/blob/master/EZToolKit/EZCategory/NSTimer%2BEZ_Helper.m

提醒

上面的解決辦法,只是解決了target的強引用問題,但是NSTimer銷毀還是得自己在使用的viewController的dealloc方法中銷毀

- (void)dealloc {
    if ([self.timer isValid]) { [self.timer invalidate]; self.timer = nil; } }

或者你有更好的辦法,請拼命的@我

NSTimer的創建方式

創建方式有2種

1.這種創建方式,會主動添加到主循環中,即默認會執行,但當用戶按住其他控件的時候,它就會停止執行,當放開控件,它才繼續執行

__weak typeof(self) weakSelf = self;
self.timer = [NSTimer ez_scheduledTimerWithTimeInterval:1.f block:^{ NSLog(@"nextPage"); [weakSelf nextPage]; } repeats:YES];

2.這種創建方式,不會主動添加到主循環中,得手動添加,有兩種執行模式

NSRunLoopCommonModes 按住其它控件,不會停止執行
NSDefaultRunLoopMode 按住其它控件,會停止執行,和第一種方式一樣
self.timer = [NSTimer ez_timerWithTimeInterval:1.f block:^{ NSLog(@"nextPage"); [weakSelf nextPage]; } repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM