2012-01-21 2 views
1

Я объявляю таймер, определяющий его код блоком (для выполнения этого кода каждые x секунд).Освобождение памяти, используемой в блоке таймера, но выделенной из нее, при остановке таймера

Я хочу, чтобы таймер запускался, когда пользователь нажимает кнопку, поэтому я создаю и возобновляю таймер внутри функции, которая является IBAction.

И, наконец, это проблема, так как данные, управляемые в блоке, всегда имеют одинаковый размер, чтобы избежать выделения и освобождения памяти каждый раз, когда срабатывает таймер, я выделяю память как указатели __block из блока , но внутри функции (они не могут быть объявлены из этой локальной области).

Все работает нормально, но я хочу, с другой кнопкой, остановить и перезапустить таймер несколько раз, поэтому ¿как я могу освободить память, выделенную в функции? Я хочу выделить его каждый раз, когда кнопка «Begin Button» срабатывает, а не каждый раз, когда срабатывает таймер, и освобождайте его, когда нажата кнопка «Stop». ¿Возможно ли с помощью этой структуры кода? ¿Каков наилучший способ сделать то, что я хочу?

Это код:

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); 

} 

ответ

0

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

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

+0

Jodocus, я думаю, что сделаю то, что вы говорите, выделив память в viewDidLoad. В таком случае, где я должен освобождать указатели? Должен ли я писать «free (array)» в dealloc или он не нужен? – angeleke

+0

Я не использовал NSTimer, потому что я читал, что он тяжелее, чем таймеры низкого уровня, и он имеет более низкую точность. Во всяком случае, это временное решение, потому что я понятия не имею об этом, но я, вероятно, изменю его. благодаря – angeleke

Смежные вопросы