Правильно dealloc NSOperationQueue

Я хотел бы знать, что является надлежащим способом освобождения ivar NSOperationQueue в случае, если у него все еще есть некоторые операции, которые обычно могут возникать, когда пользователь внезапно покидает приложение. В некоторых примерах я видел, как используется waitUntilAllOperationsAreFinished, например:


- (void)dealloc {
    [_queue cancelAllOperations];
    [_queue waitUntilAllOperationsAreFinished];
    [_queue release];
    ...

однако многие предлагают избегать этого, так как он виснет цикл выполнения. Итак, каков правильный способ выпуска _queue? И что произойдет, если я не буду ждать завершения операций и просто продолжу выпуск?

Ответ 1

Почти во всех случаях вызова cancelAllOperations будет достаточно. Единственный раз, когда вам нужно позвонить waitUntilAllOperationsAreFinished, - это если вам действительно нужно убедиться, что эти операции выполняются, прежде чем двигаться дальше.

Например, вы можете сделать это, если операторы получают доступ к некоторой разделяемой памяти, и если вы не ждете, тогда вы в конечном итоге получите два потока, которые будут записываться в эту общую память. Однако я не могу придумать какой-либо разумный дизайн, который защитил бы общую память, вызвав задержку блокировки в методе dealloc. Доступны гораздо лучшие механизмы синхронизации.

Таким образом, короткий ответ таков: вам не нужно ждать завершения всех операций, если нет причин, по которым ваше приложение нуждается в этом.