Причина сбоя в том, что этот код :
void
_dispatch_source_xref_release(dispatch_source_t ds)
{
if (slowpath(DISPATCH_OBJECT_SUSPENDED(ds))) {
// Arguments for and against this assert are within 6705399
DISPATCH_CLIENT_CRASH("Release of a suspended object");
}
_dispatch_wakeup(ds);
_dispatch_release(ds);
}
Итак, вы не можете выпустить dispatch_source_t
, который был приостановлен. Вы, вероятно, хотите просто не приостанавливать его в resetTimer
Полагаю.
Хотя я не могу найти в документах ничего, почему они написали это так (а комментарий ссылается на плюсы и минусы, которые мы никогда не увидим в радаре), все, что я могу сделать, это обратиться к документы, где написано :
Вы можете приостановить и возобновить доставку исходных событий отправки.
временно используя методы dispatch_suspend и dispatch_resume.
Эти методы увеличивают и уменьшают количество приостановок для вашего
объект отправки. В результате вы должны балансировать каждый звонок
dispatch_suspend с соответствующим вызовом dispatch_resume перед событием
Доставка возобновляется.
Хотя это не говорит о том, что вы не можете освободить источник отправки, который был приостановлен, оно говорит о том, что вы должны балансировать каждый вызов, поэтому я предполагаю, что это что-то вроде того, что он использует семафор диспетчеризации под капюшон, который должен быть сбалансирован, прежде чем он может быть освобожден Хотя это только мое предположение: -).
Что касается «могу ли я вызвать dispatch_suspend в блоке event_handler источника таймера». Я уверен, что вы можете, да, согласно документам для dispatch_suspend
:
Приостановка происходит после завершения любых блоков, работающих во время вызова.