输出:
2016-12-29 16:52:54.029 定时器[12089:289673] 0---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:54.029 定时器[12089:289673] start
2016-12-29 16:52:55.104 定时器[12089:289673] 1---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:56.095 定时器[12089:289673] 2---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:57.098 定时器[12089:289673] 3---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:58.094 定时器[12089:289673] 4---<__NSCFTimer: 0x60000017d940>
可以看出, 这里定时器是立马就执行了, 没有延迟;
此方法可以传递多个参数, 下面是传递两个参数的示例:
// NSInvocation形式
- (void)timer2 {
NSMethodSignature *method = [ViewController instanceMethodSignatureForSelector:@selector(invocationTimeRun:des:)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:method];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 invocation:invocation repeats:YES];
// 设置方法调用者
invocation.target = self;
// 这里的SEL需要和NSMethodSignature中的一致
invocation.selector = @selector(invocationTimeRun:des:);
// 设置参数
// //这里的Index要从2开始,以为0跟1已经被占据了,分别是self(target),selector(_cmd)
// 如果有多个参数, 可依次设置3 4 5 ...
[invocation setArgument:&timer atIndex:2];
// 设置第二个参数
NSString *dsc = @"第二个参数是字符串";
[invocation setArgument:&dsc atIndex:3];
[invocation invoke];
NSLog(@"start");
}
- (void)invocationTimeRun:(NSTimer *)timer des:(NSString *)dsc {
static NSInteger num = 0;
NSLog(@"%ld---%@--%@", (long)num, timer, dsc);
num++;
if (num > 4) {
[timer invalidate];
}
}
输出:
2016-12-29 16:57:45.087 定时器[12183:292324] 0---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:45.088 定时器[12183:292324] start
2016-12-29 16:57:46.161 定时器[12183:292324] 1---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:47.161 定时器[12183:292324] 2---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:48.150 定时器[12183:292324] 3---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:49.159 定时器[12183:292324] 4---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo
参数:
ti: 时间间隔 aTarget: 调用者 aSelector: 执行的方法 userInfo: 参数 yesOrNo: 是否重复执行示例:
- (void)timer3 {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(targetRun:) userInfo:@"这是携带的参数" repeats:YES];
NSLog(@"start");
}
- (void)targetRun:(NSTimer *)timer {
static NSInteger num = 0;
NSLog(@"%ld---%@--%@", (long)num, timer, timer.userInfo);
num++;
if (num > 4) {
[timer invalidate];
}
}










