博客> 认识NSTimer以及其简单使用
认识NSTimer以及其简单使用
2018-11-11 14:05 评论:0 阅读:685 tanlong
ios 定时器 NSTimer

初次使用cocoaChina发博,对NSTimer也有很多个人偏见与局限性,希望各位大神指正。 首先我们来认识一下,什么是NSTimer? 1.什么是NSTimer?   NSTimer就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象。   2.NSTimer会不会造成内存泄漏?    从官方给出的解释我们得出timer会在未来的某个时刻执行一次或者多次程序指定的方法,那如何保证timer在未来的某个时刻触发指定事件的时候,我们指定的方法是有效的呢?   其实系统会在定时器的方法接收者retain一次。不管是一次性的还是周期性的定时器都会对它的方法的接收者进行retain,区别就在于一次性的定时器在完成调用以后会自我invalidate,而周期性的定时器需要你手动调用invalidate方法,否则它是永远存在的。

3.NSTimer是每次都会准时触发的吗?如果在其实进行了其他延时性操作会怎么样?   答案是否定的,NSTimer并不会每次都那么准时触发,它并不是那么精确。NSTimer不是一个实时系统,不管是一次的还是周期性的定时器都会有时间出入。   那在定时器执行期间,插入了一个延迟性的操作,会怎么样呢?比如我添加了一个定时器,2秒钟触发一次事件,但我在定时器执行期间加入一个很大的数据处理模块,需要大于2秒钟。在这种情况下,定时器就会延迟到该处理模块执行完以后才会执行。并且在一个周期内只会触发一次,通俗的讲,但是不管该定时器的触发时间延迟的有多离谱,数据处理模块执行完毕后,定时器只会紧接着触发一次,并不会因为数据处理模块用了6秒钟,定时器就连着触发3次。   定时器并不是一种实时的机制,它会存在延迟。

//以下是写在工程ViewController.m中的代码,发表后排行可能出现错误,望谅解

import "ViewController.h"

@interface ViewController (){ NSTimer *_myTimer; }

@end

@implementation ViewController

  • (void)viewDidLoad { [super viewDidLoad];

    / interval: 此处设置为2.0,即表示2.0s后开始调用定时器,若下方repeats设置为YES,则每过2.0s都会执行一次,即循环执行 target: 执行的对象 selector:关联的方法 userInfo:需要传递的参数(可以是单个也可以是多个,推荐使用字典) repeats:是否重复执行,设置为NO,则只执行一次 第一种创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。 而第二种创建方式,必须手动把timer加入MainRunloop的NSDefaultRunLoopMode中 /

    //第一种创建方式(可以不使用NSTimer进行接收,但如果这样做,就不能立即调用定时器),这里传了参数 _myTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target: self selector: @selector(timeAction:) userInfo: @"我是定时器_myTimer" repeats: YES]; //第二种创建方式,也可以不传参数 NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerAct:) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    //如果此处调用fire方法,则定时器立即运行一次,无需等待interval值设置的时间 //[myTimer fire]; [timer fire]; NSLog(@"--1--");

    //这里创建3个按钮,关联三个方法,分别用来暂停,继续,撤销定时器_myTimer UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake( 50, 200, 100, 60); [button setBackgroundColor: [UIColor grayColor]]; [button setTitle:@"stop" forState:UIControlStateNormal]; [button addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview: button];

    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeSystem]; button2.frame = CGRectMake( 50, 400, 100, 60); [button2 setBackgroundColor: [UIColor grayColor]]; [button2 setTitle:@"continue" forState:UIControlStateNormal]; [button2 addTarget:self action:@selector(continueAction) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview: button2];

    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeSystem]; button3.frame = CGRectMake( 50, 600, 100, 60); [button3 setBackgroundColor: [UIColor grayColor]]; [button3 setTitle:@"invalidate" forState:UIControlStateNormal]; [button3 addTarget:self action:@selector(invalidate) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview: button3]; }

/* 以下是2个定时器关联的方法(推荐带NSTimer参数,这样可以在需要时撤销定时器) 以及3各按钮关联的方法,分别做暂停,继续,撤销定时器操作

例如:1.运行程序,控制台立即打印--3--,--1--,2s后再打印--2--我是定时器_myTimer, 之后每过2s打印一次--3--,--2--. 2.点击暂停,定时器_myTimer暂停,控制台不再打印--2--我是定时器_myTimer。 3.点击继续,控制台立即打印一次--2--我是定时器_myTimer,之后再循环打印。每点击一次继续,都会立即调用一次定时器,我是定时器_myTime,打印一次--2--我是定时器_myTimer。 4.点击撤销,定时器_myTimer再不复存在了,之后再点击暂停继续都不会再做出响应。 */

//定时器_myTimer关联的方法,这里打印传入的参数

  • (void) timeAction:(NSTimer *) timer{ NSLog(@"--2--%@",timer.userInfo); }

//定时器_timer关联的方法

  • (void) timerAct: (NSTimer *) timer{ NSLog(@"--3--"); }

//暂停定时器(定时器还存在) //例如设计一个游戏app,在程序进入后台时,可以暂停定时器,回到游戏时再继续定时器

  • (void)stop { [_myTimer setFireDate:[NSDate distantFuture]]; }

//开启(继续)定时器 -(void)continueAction{ //开启定时器 [_myTimer setFireDate:[NSDate distantPast]]; }

//撤销定时器(定时器不存在了)

  • (void)invalidate{ [_myTimer invalidate]; //撤销后,推荐再nil一次 _myTimer = nil; }

//第一次发表文章,希望各位大神能够指正我的错误,谢谢。

收藏
1
sina weixin mail 回到顶部