1

我正在声明一个计时器,用一个块指定它的代码(为了每 x 秒执行一次此代码)。

我希望定时器在用户点击按钮时启动,所以我在一个 IBAction 函数中创建并恢复定时器。

最后,这就是问题所在,因为块中管理的数据始终具有相同的大小,为了避免每次定时器触发时分配和释放内存,我将内存分配为块外的 __block 指针,但在块内函数(它们不能被声明在这个本地范围之外)。

一切正常,但我想用另一个按钮停止并重新启动计时器几次,所以¿我怎样才能释放函数中分配的内存?我想在每次点击“开始按钮”时分配它,而不是每次触发计时器时分配它,并在点击“停止按钮”时释放它。¿ 这种代码结构是否可行?¿ 做我想做的事的最佳方式是什么?

这是代码:

 dispatch_source_t creaTimer(uint64_t interval,uint64_t leeway, dispatch_queue_t queue,                                                          dispatch_block_t block){

 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);    

 if (timer)
  {
     dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
     dispatch_source_set_event_handler(timer, block);
  }
  return timer;
}


-(IBAction) begin{

   __block double *array;
   array = (double*) malloc (512);

   timer = creaTimer(5ull * NSEC_PER_SEC, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)
                  ,^{ 
                      //it uses the space allocated in *array;
                    });    

   dispatch_resume(timer); 

}
4

1 回答 1

0

这不是通过使“数组”成为实例变量(通过在.h文件中声明它)来解决的吗?

还有一个问题:你真的想使用 GCD 的低级 API 吗?NSTimer 也不够吗?还是我没有正确解释您的代码?

于 2012-01-21T13:26:26.597 回答