由于创建计时器时候对象会把计时器保存起来,而计时器需要执行对应的方法也要把对象保存起来,这样就形成了一个保留环。解决方法就是创建一个分类给NSTimer添加一个方法,把所要执行的任务封装成块传进去,block中需要引入一个weakSelf才能避免循环引用,传入参数时要通过copy将block拷贝到堆上,代码如下:
@implementation NSTimer (ZJJTimer)
+(void)eoc_blockInvoke:(NSTimer *)timer{
void (^block)() = timer.userInfo;
if (block) {
block();
}
}
+(NSTimer *)eoc_scheduleTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats{
return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(eoc_blockInvoke:) userInfo:[block copy] repeats:repeats];
}