IOS NSTimer 定时器用法总结

NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下:

一、初始化方法:有五种初始化方法,分别是

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

?


1

2

3

4

5

6

7

8

9

10

11

12

- (void)viewDidLoad {

    [super viewDidLoad];

    //初始化一个Invocation对象

    NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(init)]];

    [invo setTarget:self];

    [invo setSelector:@selector(myLog)];

    NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];

    //加入主循环池中

    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

    //开始循环

    [timer fire];

}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

?


1

  NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

?


1

NSTimer * timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(myLog) userInfo:nil repeats:NO]

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

?


1

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:@"123" repeats:YES]

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)rep 

?


1

2

 NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantPast] interval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];

    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

注意:这五种初始化方法的异同:

        1、参数repeats是指定是否循环执行,YES将循环,NO将只执行一次。

        2、timerWithTimeInterval这两个类方法创建出来的对象如果不用 addTimer: forMode方法手动加入主循环池中,将不会循环执行。并且如果不手动调用fair,则定时器不会启动。

        3、scheduledTimerWithTimeInterval这两个方法不需要手动调用fair,会自动执行,并且自动加入主循环池。

        4、init方法需要手动加入循环池,它会在设定的启动时间启动。

二、成员变量

@property (copy) NSDate *fireDate;

这是设置定时器的启动时间,常用来管理定时器的启动与停止

?


1

2

3

4

    //启动定时器

    timer.fireDate = [NSDate distantPast];

    //停止定时器

    timer.fireDate = [NSDate distantFuture];

@property (readonly) NSTimeInterval timeInterval;

这个是一个只读属性,获取定时器调用间隔时间。

@property NSTimeInterval tolerance;

这是7.0之后新增的一个属性,因为NSTimer并不完全精准,通过这个值设置误差范围。

@property (readonly, getter=isValid) BOOL valid;

获取定时器是否有效

@property (readonly, retain) id userInfo;

获取参数信息

三、关于内存释放

如果我们启动了一个定时器,在某个界面释放前,将这个定时器停止,甚至置为nil,都不能是这个界面释放,原因是系统的循环池中还保有这个对象。所以我们需要这样做:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

-(void)dealloc{

    NSLog(@"dealloc:%@",[self class]);

}

- (void)viewDidLoad {

    [super viewDidLoad];

    timer= [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];

    btn.backgroundColor=[UIColor redColor];

    [btn addTarget:self action:@selector(btn) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

}

-(void)btn{

    if (timer.isValid) {

        [timer invalidate];

    }

    timer=nil;

    [self dismissViewControllerAnimated:YES completion:nil];

}

在官方文档中我们可以看到 [timer invalidate]是唯一的方法将定时器从循环池中移除。

时间: 2024-11-03 08:38:13

IOS NSTimer 定时器用法总结的相关文章

iOS中的NSTimer定时器的初步使用解析_IOS

创建一个定时器(NSTimer) - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES]; } - (void)actionTimer:(NSTimer *)timer { } NSTimer默认运行在default mode下,default

iOS - OC NSTimer 定时器

前言 @interface NSTimer : NSObject @interface CADisplayLink : NSObject 作用 在指定的时间执行指定的任务. 每隔一段时间执行指定的任务. 1.定时器的创建 1.1 NSTimer 定时器 当定时器创建完(不用 scheduled 的,添加到 runloop 中)后,该定时器将在初始化时指定的 ti 秒后自动触发.如果 NSTimer 的触发时间到的时候,runloop 在阻塞状态,触发时间就会推迟到下一个 runloop 周期.

iOS - Swift NSTimer 定时器

前言 public class NSTimer : NSObject 作用 在指定的时间执行指定的任务. 每隔一段时间执行指定的任务. 1.定时器的创建 当定时器创建完(不用 scheduled 的,添加到 runloop 中)后,该定时器将在初始化时指定的 ti 秒后自动触发. scheduled 方式: 创建并启动定时器. 默认将时钟以 NSDefaultRunLoopMode 模式添加到运行循环. 发生用户交互的时候,时钟会被暂停. /* public class func schedul

iOS开发定时器的三种方法分享_IOS

前言 在开发中,很多时候我们需要用到定时器实时刷新某个数值.这个时候我们就需要用到定时器,这里,我为大家推荐三种方法,分别是:NSTimer.CADisplayLink.GCD.接下来我就一一介绍它们的用法.希望能帮到大家. 一.NSTimer(一般用于定时的更新一些非界面上的数据) 1. 创建方法 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:

iOS中UIImageView用法总结

iOS中UIImageView用法总结 - (instancetype)initWithImage:(UIImage *)image; 通过一个图片UIImage对象进行初始化 - (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage; 通过一个正常状态下的图片和高亮状态下的图片初始化对象 @property(nonatomic,retain) UIImage *imag

JS定时器用法分析【时钟与菜单中的应用】_javascript技巧

本文实例分析了JS定时器用法.分享给大家供大家参考,具体如下: 开启定时器: setInterval 间隔型    //一旦启动就不会停,重复执行 setTimeout 延迟型   //只执行一次 停止定时器: clearInterval clearTimeout 关闭定时器如果只是clearInterval()那会关掉所有的定时器,有时我们只需要关掉一个而已,所以要定义一个变量来存放定时器 var timer=null; btn1.onclick=function(){ timer=setIn

iOS中定时器NSTimer的使用

1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelec

NSTimer定时器的使用

前言:这是关于NSTimer的学习笔记.   正文内容大纲: 1.关于计时器NSTimer的一个被添加进NSRunLoop的使用细节 2.关于NSTimer常用方法的使用 3.关于NSTimer的类别工具类   正文: 1.关于计时器NSTimer的一个被添加进NSRunLoop的使用细节 下面展示一个示例: 在NSTimer scheduledTimerWithTimeInterval方法中,底层是会执行第11.12行代码的,只是和上面代码不一样的是,forMode的参数是NSDefaultR

Javascript中setTimeOut和setInterval的定时器用法

 Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等.但它们的应用是有区别的. setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除.也就是说setTimeout()只执行一次,setInterval()可以执行多次.两个函