創建定時器會在一定的間隔後執行某些操作,一般大家會這樣創建定時器,這樣創建的定時,self對定時器有個引用,定時器對self也有個引用,造成了迴圈引用,最終造成了記憶體泄漏,如果定時器在做下載的操作就會一直下載。 解決辦法:首先創建NSTimer的這樣的一個分類:NSTimer+eocBlockSup ...
創建定時器會在一定的間隔後執行某些操作,一般大家會這樣創建定時器,這樣創建的定時,self對定時器有個引用,定時器對self也有個引用,造成了迴圈引用,最終造成了記憶體泄漏,如果定時器在做下載的操作就會一直下載。
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(startTimer) userInfo:nil repeats:YES];
解決辦法:首先創建NSTimer的這樣的一個分類:NSTimer+eocBlockSupports代碼如下,可以看出它把定時器需要執行的操作放在了block這個參數中,返回一個定時器時block傳給了userInfo ,執行定時器的操作時定時器獲得userinfo的block執行block
// // NSTimer+eocBlockSupports.h #import <Foundation/Foundation.h> @interface NSTimer (eocBlockSupports)
//類方法返回一個NSTimer的實例對象 +(NSTimer *)eocScheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval block:(void(^)()) block repeats:(BOOL)repeat; @end // // NSTimer+eocBlockSupports.m #import "NSTimer+eocBlockSupports.h" @implementation NSTimer (eocBlockSupports) +(NSTimer *)eocScheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval block:(void(^)()) block repeats:(BOOL)repeat{ return [self scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(startTimer:) userInfo:[block copy] repeats:repeat]; } //定時器所執行的方法 +(void)startTimer:(NSTimer *)timer{ void(^block)() = timer.userInfo; if (block) { block(); } } @end
NSTimer的分類創建完成後,創建定時的代碼如下:一定要弱化self否則還是無法解決迴圈引用的問題。
__weak typeof(self)weakSelf = self;
self.timer = [NSTimer eocScheduledTimerWithTimeInterval:1.0 block:^{
[weakSelf startTimer];
} repeats:YES];