ARC下用Block解决NSTimer"保留环"的问题

解决的方法是在NSTimer 的基础上,建一个分类(Category) 并实现一个类方法,这里我们叫做:

+(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];




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值