Утечки памяти при генерации событий таймера источника отправки - PullRequest
1 голос
/ 10 апреля 2011

Мы используем очереди отправки для генерации событий таймера.Ниже приведен код, который выполняет задачу:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (!timer) return self;
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval * NSEC_PER_SEC, 5 * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, 
^{
    //Some work…
});

Это работает очень хорошо, за исключением того, что когда мы запускаем профилировщик, мы видим много утечек памяти из-за этих методов:

  • dispatch_source_create
  • dispatch_source_set_timer
  • dispatch_source_set_event_handler

Мы убедились, что таймер освобождается с помощью метода dispatch_release ().

Может кто-нибудь сообщить нам, если мы делаем какую-либо ошибку в приведенном выше коде?А также, если вы можете указать на любой пример генерации события таймера, это будет полезно.

1 Ответ

4 голосов
/ 13 апреля 2011

dispatch_source_set_timer (3) Страница руководства Mac OS X

Все таймеры будут повторяться бесконечно, пока не будет вызвана dispatch_source_cancel ().

Как сделатьВы вызываете dispatch_source_cancel () и dispatch_release () для таймера?

Пример таймера источника отправки:

dispatch_source_t timer = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));

dispatch_source_set_timer(timer,
    dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC),
        DISPATCH_TIME_FOREVER, 1ull * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, ^{
    NSLog(@"wakeup!");

    dispatch_source_cancel(timer);
});

dispatch_source_set_cancel_handler(timer, ^{
    NSLog(@"canceled");

    dispatch_release(timer);
});

dispatch_resume(timer);
...