NSTimerInprovement
NSTimerInprovement这个库解决了定时器循环应用bug,并集成了NSRunloop技术(苹果官方文档中提到过此技术),同时还管理了NSTimer的生命周期,再也不用担心NSTimer何时释放的问题了。
如何使用
在使用需要定时器的对象中声明一个属性,例如:
@property (nonatomic, strong) NSTimerInprovement *timerInprovement; // 必须要如此才行,否则会导致崩溃
使用 NSTimerInprovement 替代定时器时有6种方法,分别对应于 NSTimer 的6种创建定时器的方法,分别是:方法1:
// 此方法等同于 NSTimer 的 "+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo"
self.timerInprovement = [NSTimerInprovement ns_timerWithTimeInterval:1.0 target:self selector:@selector(timerFire:) userInfo:nil repeats:YES];
方法2:
// 此方法等同于 NSTimer 的"+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo"
self.timerInprovement = [NSTimerInprovement ns_scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFire:) userInfo:nil repeats:YES];
方法3:
// 此方法等同于 NSTimer 的"+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block",但是仅适用于iOS 10.0以上的系统
// 注意内存泄漏
__weak typeof(self) weakSelf = self;
self.timerInprovement = [NSTimerInprovement ns_timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer *timer) {
[weakSelf timerFire:timer];
}];
方法4:
// 此方法等同于 NSTimer 的 "+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block",但是仅适用于iOS 10.0以上的系统
// 注意内存泄漏
__weak typeof(self) weakSelf = self;
self.timerInprovement = [NSTimerInprovement ns_scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer *timer) {
[weakSelf timerFire:timer];
}];
方法5:
// 此方法等同于 NSTimer 的 "- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(nullable id)ui repeats:(BOOL)rep"
NSDate *date = [[NSDate date] dateByAddingTimeInterval:10.0];
self.timerInprovement = [NSTimerInprovement ns_scheduledTimerWithFireDate:date interval:1.0 target:self selector:@selector(timerFire:) userInfo:nil repeats:YES];
方法6:
// 此方法等同于 NSTimer 的 "- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block",但是仅限于iOS 10.0以上
// 注意内存泄露
__weak typeof(self) weakSelf = self;
NSDate *date = [[NSDate date] dateByAddingTimeInterval:10.0];
self.timerInprovement = [NSTimerInprovement ns_scheduledTimerWithFireDate:date interval:1.0 repeats:YES block:^(NSTimer *timer) {
[weakSelf timerFire:timer];
}];
除此之外,NSTimer 还有两个基于 NSInvocation 实现的方法,这里就不再详细说明了。
如果需要对 NSTimer 对象进行操作,例如执行 'invalidate' 操作,可以像下面这样从 NSTimerInprovement 对象的.h 文件中获取 NSTimer 对象(出于安全考虑,这个属性是只读的):
[self.timerInprovement.timer invalidate];
安装(Installation)
可以下载此工程,将 NSTimerInprovement 类的 .h 和 .m 文件拖到自己的项目当中,也可以使用 Cocoapods 进行管理,只需在 Podfile 文件中写入以下代码然后执行 'pod install' 即可:
pod 'NSTimerInprovement'