2011-04-10 27 views
1

我们使用调度队列来生成定时器事件。以下是它执行任务的代码:生成调度源定时器事件时发生内存泄漏

 
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()方法释放。

有人能让我们知道我们在上面的代码中是否有任何错误吗?而且,如果您可以指出任何计时器事件生成的例子,这将会有所帮助。

回答

4

dispatch_source_set_timer(3) Mac OS X Manual Page

所有的计时器将无限重复,直到 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); 
+0

感谢您的答复。我将你的示例代码与我的相比。它看起来几乎相同。我在dealloc中取消并释放,我可以看到被调用。对我来说,定时器事件正常提升,一切正常。问题是,当我运行分析器时,我发现内存泄漏。 – 2011-04-13 05:08:09