1、改变target为非self
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self.viewModel selector:@selector(countdown:) userInfo:nil repeats:YES];
2、iOS10以后提供了block实现
__weak __typeof(self) weakSelf = self;
if (@available(iOS 10.0, *)) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf countdown];
}];
//或
self.timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf countdown];
}];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
} else {
// Fallback on earlier versions
}
3、category
typedef void(^TimerBlock)(void);
@interface NSTimer (WSTimer)
+ (NSTimer *)xfTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(TimerBlock)block;
@end
@implementation NSTimer (WSTimer)
+ (NSTimer *)xfTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(TimerBlock)block{
return [self timerWithTimeInterval:interval target:self selector:@selector(timerSelector:) userInfo:block repeats:repeats];
}
+ (void)timerSelector:(NSTimer *)timer{
TimerBlock block =[timer userInfo];
if (block) {
block();
}
}
@end
使用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
__weak __typeof(self) weakSelf = self;
self.timer = [NSTimer xfTimerWithTimeInterval:1 repeats:YES block:^{
[weakSelf countdown];
}];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}