2013-10-15 2 views
0

Я использовал GCD. Проект ARC. Когда вызов этот код второй раз, крах проекта ...Ошибка создания очереди GCD

if (self.queue) 
{ 
     dispatch_suspend(self.queue); 
     self.queue = NULL; 
}  
self.queue = dispatch_queue_create("com.myapp.blabla.queue", NULL); 
dispatch_async(self.queue, ^{ 
     [self hardMethod]; 
}); 

Разбился строка self.queue = NULL; Необходимость, купируются и освободить старую очередь и создать новую очередь

+0

Нужна дополнительная информация. Какая авария? Какую ошибку вы видите в консоли? –

+0

Вы используете 'queue' и' imageQueue'. – Eimantas

+0

Xcode show '0x388d7ffc: trap Thread 1: EXC_BREAKPOINT (code = EXC_ARM_BREAKPOINT, subcode = 0xdefe)' – user2828120

ответ

0

Если то, что вы действительно хотите сделать, это отменить предыдущий вызов до hardMethod перед тем, как начать новый, вы должны действительно проверить NSOperation и NSOperationQueue, которые имеют явную поддержку для отмены.

+3

С 10.8 и iOS 6 объекты отправки являются «сохраняемыми указателями объектов», которые находятся под контролем ARC (которые не могут быть явно выпущены). – CouchDeveloper

+4

CouchDeveloper прав относительно объектов отправки, управляемых ARC. В более общем плане, не разрешено освобождать объект отправки, который * приостановлен *. Если вам нужно отменить, вы можете либо использовать NSOperation, либо сделать что-то похожее на описанный здесь подход: http://stackoverflow.com/a/18765522/438982 – ipmcc

+0

Спасибо CouchDeveloper ... Я удалил свою рекомендацию о выпуске этого очередь отправки. –

1

Приостановка очереди, а затем отбрасывание вашей единственной ссылки на эту очередь вряд ли достигнет того, что вы думаете.

В теории вы ожидаете утечки: когда вы вызываете dispatch_suspend, текущая выполняемая задача будет завершена, но любые ожидающие задачи будут приостановлены (и будут поддерживать сильную ссылку на очередь). Хуже того, потому что вы отбросили свою единственную ссылку на очередь, у вас никогда не будет возможности возобновить работу очереди и освободить эти ресурсы. Теоретически, вы пропустили бы очередь и любые блокированные отправленные блоки (и любые объекты, к которым эти блокированные блоки имеют сильные ссылки).

На практике, когда вы это сделаете (удалите последнюю сильную ссылку на приостановленную очередь в iOS 6+), она сработает. Возможно, iOS должен справиться с этим более грациозно, но, тем не менее, неудивительно, что сценарий удаления вашей последней ссылки на приостановленную очередь, не имея возможности возобновить ее, будет проблематичным.

Нижняя линия, не приостанавливайте очередь и затем пытайтесь ее освободить. Если вы хотите отменить фоновые задачи, вы можете использовать operation queues, а не Grand Central Dispatch. Операционные очереди обрабатывают отмененные операции более грациозно, и если вы используете подкласс NSOperation, вы даже можете написать код для обработки отмены операции, которая также может выполняться.

Смежные вопросы