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