Я объявляю таймер, задающий его код с помощью блока (для выполнения этого кода каждые 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);
}