NSTimer的八種建立方式

解決NSTimer循環引用致使內存泄漏的三種方法ios

12345678 表明1-8種建立方式macos

參數介紹:
interval: 時間間隔,單位:秒,若是<0,系統默認爲0.1
target: 定時器綁定對象,通常都是self
selector: 須要調用的實例方法
userInfo: 傳遞相關信息
repeats: YES:循環   NO:執行一次就失效
block: 須要執行的代碼塊  做用等同於  selector裏邊的方法體
invocation: 須要執行的方法,具體使用方法能夠本身baidu,如今這個已經不多用了。
fireDate: 觸發的時間,通常都寫[NSDate date],這樣的話定時器會立馬觸發一次,而且以此時間爲基準。若是沒有此參數的方法,則都是以當前時間爲基準,第一次觸發時間是當前時間加上時間間隔interval
複製代碼
#pragma mark - CreateTimer
- (void)createTimer{
    NSInvocation *invocation = [[NSInvocation alloc] init];
    
    //1
    NSTimer *timer1 = [NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer1 forMode:NSDefaultRunLoopMode];
    
    //2
    [NSTimer scheduledTimerWithTimeInterval:1 invocation:invocation repeats:YES];

    //3
    [NSTimer timerWithTimeInterval:1 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    
    //4
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    
    //5   API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0))
    [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        //定時器須要執行的方法
    }];
    
    //6   API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0))
    [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        //定時器須要執行的方法
    }];
    
    NSDate *date = [NSDate date];
    //7   API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0))
    NSTimer *timer7 = [[NSTimer alloc] initWithFireDate:date interval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        //定時器須要執行的方法
    }];
    [timer7 fire];
    
    //8
    NSTimer *timer8 = [[NSTimer alloc] initWithFireDate:date interval:1 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    
    //該方法表示定時器只會執行一次,無視repeats
    [timer8 fire];
}

- (void)doSomething{
    NSLog(@"do something");
}
複製代碼

1、 NSTimer 具體有八個方法來建立

十二、3四、5六、78 是參數對應的關係
複製代碼

2、 NSTimer建立能夠分爲三大類

timerWithTimeInterval 135bash

scheduledTimerWithTimeInterval 246oop

initWithFireDate 78post

3、 按照運行方式又能夠分爲兩大類

一種須要手動加入runloop 1357八、另外一種就是自動加入runloop 246(弊端:runloop只能是當前runloop,模式是NSDefaultRunLoopMode)spa

這裏須要注意一個問題,子線程的runloop是默認不開啓的,在子線程建立timer以後記得開啓[[NSRunloop currentRunloop] run]線程

相關文章
相關標籤/搜索