解決NSTimer存在的內存泄漏的問題


   創建定時器會在一定的間隔后執行某些操作,一般大家會這樣創建定時器,這樣創建的定時,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];

 


免責聲明!

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



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