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

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

}

person angeleke    schedule 21.01.2012    source источник


Ответы (1)


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

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

person Jodocus    schedule 21.01.2012
comment
Jodocus, думаю, я сделаю то, что вы говорите, выделив память в viewDidLoad. В таком случае, где мне освободить указатели? Должен ли я писать свободный (массив) в dealloc или он не нужен? - person angeleke; 21.01.2012
comment
Я не использовал NSTimer, потому что я читал, что он тяжелее, чем таймеры низкого уровня, и имеет худшую точность. В любом случае, это временное решение, потому что я понятия не имею об этом, но, вероятно, я его изменю. Спасибо - person angeleke; 21.01.2012