Во-первых, позвольте мне поблагодарить вас. Я набираю CFRunLoopRemoveSource
в Google, чтобы найти ваше сообщение, которое является именно той проблемой, которую я пытался решить, и ваше решение, позвонив по номеру CFRunLoopSourceInvalidate
, также решает мою проблему.
Теперь разница между CFRunLoopRemoveSource
и CFRunLoopSourceInvalidate
составляет:
CFRunLoopRemoveSource
удаляет
источник из конкретного цикла выполнения вы
указать.
CFRunLoopSourceInvalidate
отображает
источник неверен и удалит его
из всех беговых петель, где было
добавлен.
Теперь сбой, который, как я подозреваю, такой же, как и у меня, состоит в том, что цикл выполнения, к которому был добавлен источник, исчез, а попытка удалить из него источник приводит к сбою. На самом деле, бесконечный цикл в __spin_lock
в моем случае.
Теперь, как может исчезнуть цикл выполнения? Циклы выполнения привязаны к потокам. Вы создаете новый поток, у вас есть новый цикл выполнения, автоматически. Если поток заканчивается, цикл выполнения исчезает вместе с ним. Завершился поток, к которому я прикрепил цикл выполнения, и последующее удаление источника из цикла выполнения приведет к сбою.
Причина, по которой аннулирование цикла выполнения решает проблему, заключается в том, что он удаляет источник из всех циклов выполнения, к которым он был добавлен, игнорируя циклы выполнения, которых больше не существует.