建立定時器會在必定的間隔後執行某些操做,通常你們會這樣建立定時器,這樣建立的定時,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執行blockblog
// // 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;get
self.timer = [NSTimer eocScheduledTimerWithTimeInterval:1.0 block:^{it
[weakSelf startTimer];io
} repeats:YES];class