Освобождение памяти, используемой в блоке таймера, но выделенное из него, при остановке таймера - PullRequest
1 голос
/ 21 января 2012

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

}

1 Ответ

0 голосов
/ 21 января 2012

Разве это не решается путем превращения 'массива' в переменную экземпляра (путем объявления его в вашем файле .h)?

Еще один вопрос: вы действительно хотите использовать низкоуровневые API GCD? Не хватит ли и NSTimer? Или я не правильно понял ваш код?

...