我们正在使用调度队列来生成计时器事件。以下是完成任务的代码:
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_release()方法释放计时器。
如果我们在上面的代码中有任何错误,有人可以告诉我们吗?而且如果你能指出任何计时器事件生成的例子,那将会有所帮助。
答案 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);