Ale*_*ski 616
首先,我想提请你注意Cocoa/CF文档(它始终是一个很棒的第一个调用端口).Apple文档在每篇参考文章的顶部都有一个名为"Companion Guides"的部分,其中列出了所记录主题的指南(如果存在).例如,对于NSTimer
,该文件列出了两个同伴指导:
对于您的情况,定时器编程主题文章可能是最有用的,而线程主题是相关的,但不是与所记录的类最直接相关.如果你看一下Timer Programming Topics的文章,它分为两部分:
对于采用这种格式的文章,通常会有类的概述及其用途,然后是一些关于如何使用它的示例代码,在本例中是"使用计时器"部分.有关"创建和调度定时器","停止定时器"和"内存管理"的部分.从文章中,创建一个计划的,非重复的计时器可以这样做:
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
Run Code Online (Sandbox Code Playgroud)
这将创建为2.0秒后发射并调用计时器targetMethod:
上self
有一个说法,这是一个指向NSTimer
实例.
如果您想在该方法中查看更多详细信息,可以参考文档以获取更多信息,但也有关于代码的解释.
如果你想要停止一个重复的计时器,(或者在它开始之前停止一个非重复计时器),那么你需要保持一个指向NSTimer
所创建实例的指针; 通常这需要是一个实例变量,以便您可以在另一个方法中引用它.然后,您可以调用invalidate
的NSTimer
实例:
[myTimer invalidate];
myTimer = nil;
Run Code Online (Sandbox Code Playgroud)
nil
输出实例变量也是一种好习惯(例如,如果多次调用使计时器失效的方法并且实例变量未设置为nil
并且NSTimer
实例已被释放,则会抛出异常).
另请注意文章底部的内存管理要点:
因为运行循环维护计时器,所以从内存管理的角度来看,通常不需要在计划后保留对计时器的引用.由于在将方法指定为选择器时将计时器作为参数传递,因此可以在该方法中适当时使重复计时器无效.但是,在许多情况下,您还需要选择使计时器失效 - 甚至可能在启动之前.在这种情况下,您需要保留对计时器的引用,以便您可以在适当时向其发送无效消息.如果您创建一个未安排的计时器(请参阅"未计划的计时器"),那么您必须保持对计时器的强引用(在引用计数环境中,您保留它),以便在使用它之前不会取消分配.
Woo*_*ofy 331
有几种使用计时器的方法:
1)预定计时器和使用选择器
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(onTick:)
userInfo: nil repeats:NO];
Run Code Online (Sandbox Code Playgroud)
作为旁注,您可以使用如下的简单语句,而不是使用不重复的计时器并在指定的时间间隔后调用选择器:
[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];
Run Code Online (Sandbox Code Playgroud)
这将与上面的示例代码具有相同的效果; 但如果你想每隔n次调用一次选择器,你可以使用带有重复的定时器:YES;
2)自行计时器
NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
interval: 1
target: self
selector:@selector(onTick:)
userInfo:nil repeats:YES];
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
Run Code Online (Sandbox Code Playgroud)
3)未安排的计时器和使用调用
NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];
NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
invocation:inv
repeats:YES];
Run Code Online (Sandbox Code Playgroud)
然后,在需要时手动启动计时器:
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
作为一个注释,onTick:方法如下所示:
-(void)onTick:(NSTimer *)timer {
//do smth
}
Run Code Online (Sandbox Code Playgroud)
enn*_*ler 59
像这样的东西:
NSTimer *timer;
timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
target: self
selector: @selector(handleTimer:)
userInfo: nil
repeats: YES];
Run Code Online (Sandbox Code Playgroud)
#import "MyViewController.h"
@interface MyViewController ()
@property (strong, nonatomic) NSTimer *timer;
@end
@implementation MyViewController
double timerInterval = 1.0f;
- (NSTimer *) timer {
if (!_timer) {
_timer = [NSTimer timerWithTimeInterval:timerInterval target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
}
return _timer;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
-(void)onTick:(NSTimer*)timer
{
NSLog(@"Tick...");
}
@end
Run Code Online (Sandbox Code Playgroud)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO];
-(void)timerCalled
{
NSLog(@"Timer Called");
// Your Code
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
510917 次 |
最近记录: |