NSTimer用法小结

Timers的替代方法

如果只是要延迟消息的发送,可以使用NSObject的方法

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget

创建Timer的三种方法

1.scheduling a timer with the current run loop 

2.creating a timer that you later register with a run loop

3.initializing a timer with a given fire date

Scheduled Timers

以下两个方法自动注册新创建的timer到当前NSRunLoop对象,NSRunLoop的模式为默认的NSDefaultRunLoopMode

  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

只发送一次

[plain] view
plain
copyprint?

  1. - (IBAction)startOneOffTimer:sender {  
  2.    
  3.     [NSTimer scheduledTimerWithTimeInterval:2.0  
  4.              target:self  
  5.              selector:@selector(targetMethod:)  
  6.              userInfo:[self userInfo]  
  7.              repeats:NO];  
  8. }  

重复发送消息

注:创建重复发送消息的timer一般需要保存一个引用,因为需要在某个时刻停止发送消息

[plain] view
plain
copyprint?

  1. - (IBAction)startRepeatingTimer:sender {  
  2.    
  3.     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5  
  4.                               target:self selector:@selector(timerFireMethod:)  
  5.                               userInfo:[self userInfo] repeats:YES];  
  6.     self.repeatingTimer = timer;  
  7. }  

Unscheduled Timers

创建未注册的timer,使用时调用addTimer:forMode注册到NSRunLoop对象

[plain] view
plain
copyprint?

  1. - (IBAction)createUnregisteredTimer:sender {  
  2.    
  3.     NSMethodSignature *methodSignature = [self methodSignatureForSelector:@selector(invocationMethod:)];  
  4.     NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];  
  5.     [invocation setTarget:self];  
  6.     [invocation setSelector:@selector(invocationMethod:)];  
  7.     NSDate *startDate = [NSDate date];  
  8.     [invocation setArgument:&startDate atIndex:2];  
  9.    
  10.     NSTimer *timer = [NSTimer timerWithTimeInterval:0.5 invocation:invocation repeats:YES];  
  11.     self.unregisteredTimer = timer;  
  12. }  

[plain] view
plain
copyprint?

  1. - (IBAction)startUnregisteredTimer:sender {  
  2.     if (unregisteredTimer != nil) {  
  3.         NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  4.         [runLoop addTimer:unregisteredTimer forMode:NSDefaultRunLoopMode];  
  5.     }  
  6. }  

Initializing a Timer with a Fire Date

创建一个拥有指定发送日期的timer

[plain] view
plain
copyprint?

  1. - (IBAction)startFireDateTimer:sender {  
  2.     NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1.0];  
  3.     NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate  
  4.                                       interval:0.5  
  5.                                       target:self  
  6.                                       selector:@selector(countedtargetMethod:)  
  7.                                       userInfo:[self userInfo]  
  8.                                       repeats:YES];  
  9.    
  10.     timerCount = 1;  
  11.     NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  12.     [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  13.     [timer release];  
  14. }  

Stopping a Timer

[plain] view
plain
copyprint?

  1. - (IBAction)stopRepeatingTimer:sender {  
  2.     [repeatingTimer invalidate];  
  3.     self.repeatingTimer = nil;  
  4. }  
  5.    

[plain] view
plain
copyprint?

  1. 也可以从timer发送的消息中停止timer  

[plain] view
plain
copyprint?

  1. - (void)countedtargetMethod:(NSTimer*)theTimer {  
  2.    
  3.     NSDate *startDate = [[theTimer userInfo] objectForKey:@"StartDate"];  
  4.     NSLog(@"Timer started on %@; fire count %d", startDate, timerCount);  
  5.    
  6.     timerCount++;  
  7.     if (timerCount > 3) {  
  8.         [theTimer invalidate];  
  9.     }  
  10. }  

Memory Management

1. The run loop maintains the timer that is registered to it.

2. The timer is passed as an argument when you specify its method as a selector

3. You should maintain a strong reference to the unscheduled timer, in order to ensure that it's not deallocated before you use it.

4. A timer maintains a strong reference to its user info dictionary,

5. A timer maintains a strong reference to its target, so you should make sure that your timer's target survive longer than the timer itself.

Timers的替代方法

如果只是要延迟消息的发送,可以使用NSObject的方法

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget

创建Timer的三种方法

1.scheduling a timer with the current run loop 

2.creating a timer that you later register with a run loop

3.initializing a timer with a given fire date

Scheduled Timers

以下两个方法自动注册新创建的timer到当前NSRunLoop对象,NSRunLoop的模式为默认的NSDefaultRunLoopMode

  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

只发送一次

[plain] view
plain
copyprint?

  1. - (IBAction)startOneOffTimer:sender {  
  2.    
  3.     [NSTimer scheduledTimerWithTimeInterval:2.0  
  4.              target:self  
  5.              selector:@selector(targetMethod:)  
  6.              userInfo:[self userInfo]  
  7.              repeats:NO];  
  8. }  

重复发送消息

注:创建重复发送消息的timer一般需要保存一个引用,因为需要在某个时刻停止发送消息

[plain] view
plain
copyprint?

  1. - (IBAction)startRepeatingTimer:sender {  
  2.    
  3.     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5  
  4.                               target:self selector:@selector(timerFireMethod:)  
  5.                               userInfo:[self userInfo] repeats:YES];  
  6.     self.repeatingTimer = timer;  
  7. }  

Unscheduled Timers

创建未注册的timer,使用时调用addTimer:forMode注册到NSRunLoop对象

[plain] view
plain
copyprint?

  1. - (IBAction)createUnregisteredTimer:sender {  
  2.    
  3.     NSMethodSignature *methodSignature = [self methodSignatureForSelector:@selector(invocationMethod:)];  
  4.     NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];  
  5.     [invocation setTarget:self];  
  6.     [invocation setSelector:@selector(invocationMethod:)];  
  7.     NSDate *startDate = [NSDate date];  
  8.     [invocation setArgument:&startDate atIndex:2];  
  9.    
  10.     NSTimer *timer = [NSTimer timerWithTimeInterval:0.5 invocation:invocation repeats:YES];  
  11.     self.unregisteredTimer = timer;  
  12. }  

[plain] view
plain
copyprint?

  1. - (IBAction)startUnregisteredTimer:sender {  
  2.     if (unregisteredTimer != nil) {  
  3.         NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  4.         [runLoop addTimer:unregisteredTimer forMode:NSDefaultRunLoopMode];  
  5.     }  
  6. }  

Initializing a Timer with a Fire Date

创建一个拥有指定发送日期的timer

[plain] view
plain
copyprint?

  1. - (IBAction)startFireDateTimer:sender {  
  2.     NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1.0];  
  3.     NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate  
  4.                                       interval:0.5  
  5.                                       target:self  
  6.                                       selector:@selector(countedtargetMethod:)  
  7.                                       userInfo:[self userInfo]  
  8.                                       repeats:YES];  
  9.    
  10.     timerCount = 1;  
  11.     NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  12.     [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  13.     [timer release];  
  14. }  

Stopping a Timer

[plain] view
plain
copyprint?

  1. - (IBAction)stopRepeatingTimer:sender {  
  2.     [repeatingTimer invalidate];  
  3.     self.repeatingTimer = nil;  
  4. }  
  5.    

[plain] view
plain
copyprint?

  1. 也可以从timer发送的消息中停止timer  

[plain] view
plain
copyprint?

  1. - (void)countedtargetMethod:(NSTimer*)theTimer {  
  2.    
  3.     NSDate *startDate = [[theTimer userInfo] objectForKey:@"StartDate"];  
  4.     NSLog(@"Timer started on %@; fire count %d", startDate, timerCount);  
  5.    
  6.     timerCount++;  
  7.     if (timerCount > 3) {  
  8.         [theTimer invalidate];  
  9.     }  
  10. }  

Memory Management

1. The run loop maintains the timer that is registered to it.

2. The timer is passed as an argument when you specify its method as a selector

3. You should maintain a strong reference to the unscheduled timer, in order to ensure that it's not deallocated before you use it.

4. A timer maintains a strong reference to its user info dictionary,

5. A timer maintains a strong reference to its target, so you should make sure that your timer's target survive longer than the timer itself.

时间: 2024-10-30 15:16:04

NSTimer用法小结的相关文章

Java中getResourceAsStream的用法小结

Java中getResourceAsStream的用法小结 一.Java中的getResourceAsStream主要有以下三种用法:1.Class.getResourceAsStream(String path)      path 不以'/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath根下获取.     其实是通过path构造一个绝对路径,最终还是由ClassLoader获取资源. 2.Class.getClassLoader.getResourceAsStrea

static用法小结

static用法小结 static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准). (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 下面就这三种使用方式及注意事项分别说明 一.局部静态变量 在C/C++中, 局部变量按照存储形式可分为三种auto, static, register (<C语言程序设计(第二版)>谭浩强, 第174-175页)

Java中的字符串用法小结_java

本文实例总结了Java中的字符串用法.分享给大家供大家参考.具体分析如下: 字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对象.这也正体现了Java完全面向对象的语言特点. String 类 1.String类对象表示的是一个常量字符串.它是不可变长度的.也就是说,一旦创建了一个String类的实例,那么这个实例所表示的串是不可改变的.类似于 str = str + "Hello"; 这样的操作,实质上是将 s

Java中String.split()用法小结_java

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1.如果用"."作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用"|"作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.s

PHP常见数组函数用法小结_php技巧

本文实例讲述了PHP常见数组函数用法.分享给大家供大家参考,具体如下: 1.array array_merge(array $array1 [, array  $array2 [, $array]]) 函数功能:将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回结果的数组. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面. 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方

Node.js程序中的本地文件操作用法小结_node.js

Node最引以为傲的就是它有一个非常小的核心.有一些语言绑定了完整的POSIX API,而 Node实现了尽可能少的绑定,并通过同步.异步或流API形式暴露他们. 这种方法意味着,操作系统中有一些非常方便的功能,需要在Node中重建.这是一个教你如何使用文件系统软件包的实用教程. 引用文件与文件系统的交互很重要的一点是要指向正确的文件.由于NPM的包使用相对路径引用,所以你不能把路径写死在代码.有两个主要方式来以确保包能引用到正确的文件: // 使用 `path.join()` 而不是 `+`

Objective-C的内省(Introspection)用法小结_C 语言

内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面的表现尤其的优秀.内省是对象揭示自己作为一个运行时对象的详细信息的一种能力.这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息等等.NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别. 恰当地使用内省可以使面向对象的程序运行更加高效和强壮.也有助于避免错误地进行消息派发.错误地假设对象相等. 下面的部分举例

C++中的string类的用法小结_javascript技巧

相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中string类的使用.标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用.现将具体用法的一部分罗列如下,只起一个

JS产生随机数的用法小结_javascript技巧

代码如下所述: <script> function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.random(); return(Min + Math.round(Rand * Range)); } var num = GetRandomNum(1,10); alert(num); </script> var chars = ['0','1','2','3','4','5','6','7','8','