今天在改用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实例已经被释放了)