一次dispatch_source_t对象被释放小记

今天在改用dispatch_source做定时器的时候出现一个问题,先上代码

dispatch_source_t source_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
    dispatch_source_set_timer(source_timer, dispatch_walltime(NULL, 0), 1ull*NSEC_PER_SEC, 1);
dispatch_source_set_event_handler(source_timer, ^{
    NSLog(@"!!!");
});
dispatch_resume(source_timer);

代码非常简单,就是每隔一秒钟输入三个感叹号,但是在运行时竟然没有任何反应,突然想到source_timer这个本地变量肯定会在当前runloop结束后被释放,这样的话,定时器并没什么卵用,想解决这个问题的话可以让self持有source_timer(strong),如果在eventblock里面持有了source_timer也可以解决这个问题(主要原因还是因为dispatch_source比较特殊,他内部可能并没有新开线程,他拿到block后作为自己的属性,可能把自己作为弱引用传给了别的东西,别的东西调用dispatch_source的block执行的时候就发现dispatch_source实例已经被释放了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值