2011-04-10 25 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