生成调度源计时器事件时内存泄漏

时间:2011-04-10 17:50:26

标签: iphone ios ipad memory-leaks grand-central-dispatch

我们正在使用调度队列来生成计时器事件。以下是完成任务的代码:

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 个答案:

答案 0 :(得分:4)

dispatch_source_set_timer(3) Mac OS X Manual Page

  

所有计时器将无限期重复,直到        调用dispatch_source_cancel()。

如何为计时器调用dispatch_source_cancel()和dispatch_release()?

Dispatch source timer示例:

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