+(NSTimer *)clscheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void (^)())block repeats:(BOOL)repeats;
话不多说,有码才是硬道理
#import <Foundation/Foundation.h>
//接口部分
@interface NSTimer (CLBlockSupport)
+(NSTimer *)clscheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats;
@end
@implementation NSTimer (CLBlockSupport)
+(NSTimer *)clscheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void (^)())block repeats:(BOOL)repeats
{
return [selfscheduledTimerWithTimeInterval:interval target:selfselector:@selector(clblockInvoke:)userInfo:[block copy]repeats:repeats];
}
+(void)clblockInvoke:(NSTimer*)timer
{
void(^block)()=timer.userInfo;
if (block) {
block();
}
}
解释一下:这个办法如何能解决"保留环"的问题呢?通过代码可以看到,这段代码将计时器所应执行的任务封装成块,在调用计时器函数时,把他作为userinfo参数传进去.该参数可用来存放"万能值",只要计时器还有效,就会一直保留他.传入参数时要通过copy方法将block拷贝到"堆"上,否则等到稍后要执行它的时候,该块可能已经无效了.计时器现在的target是NSTimer类对象,这是一个单例,因此计时器是否会保留它,已经无所谓了.此处依然有保留环,但是因为类对象无须回收,所以不用担心.
注意:创建timer的时候,先定义一个弱(weak)引用,令其指向self,然后使Block捕获这个引用,而不是直接捕获普通的self变量,也就是说,self不会为计时器所保留.当Block开始执行时,立刻生成强(strong)引用,以保证实例在执行期间持续存活.下面是一个使用这个方法的例子:
__unsafe_unretained ClassA * weakView =self
timer = [NSTimerclscheduledTimerWithTimeInterval:1.0block:^{
ClassA * strongView = weakView;
[strongViewstartGo];
}repeats:YES];