Ответ 1
В документации нет ничего, чтобы сказать, что произойдет, когда NSOperationQueue будет выпущен. Было бы безопаснее предположить, что нет гарантии, что программа будет выполнена.
У меня есть задача, которая занимает довольно много времени и должна работать в фоновом режиме. Согласно документации, это можно сделать с помощью NSOperationQueue
. Тем не менее, я не хочу хранить глобальную копию класса NSOperationQueue
, поскольку я действительно использую ее только для одной задачи. Следовательно, я просто установил его на autorelease и надеюсь, что он не будет выпущен до того, как задача будет выполнена. Это работает.
например:
NSInvocationOperation *theTask = [NSInvocationOperation alloc];
theTask = [theTask initWithTarget:self
selector:@selector(doTask:)
object:nil];
NSOperationQueue *operationQueue = [[NSOperationQueue new] autorelease];
[operationQueue addOperation:theTask];
[theTask release];
Я немного обеспокоен. Гарантировано ли это? Или может operationQueue
получить освобождение в какой-то момент и взять с ним theTask
?
В документации нет ничего, чтобы сказать, что произойдет, когда NSOperationQueue будет выпущен. Было бы безопаснее предположить, что нет гарантии, что программа будет выполнена.
Я бы догадался, что NSOperationQueue выпускает свои задачи при его выпуске, но я заметил, что задачи завершатся и делятся, даже если я освобожу очередь сразу после добавления задачи. Тем не менее, я не думаю, что полагаюсь на это поведение - там еще чего-то выиграть, сохранив NSOperationQueue в переменной экземпляра (и выпуская его в dealloc). Переменная экземпляра даст вам способ вызвать другие методы в очереди (cancelAllOperations, setSuspended и т.д.).
Не можете ли вы использовать объект [NSOperation mainQueue]
, чтобы вам не нужно было беспокоиться о его автореализации? Если вам нужно только добавить одну задачу, которая, кажется, имеет для меня наибольшее значение.
Там нет гарантии, что безопасно освободить NSOperationQueue, пока он все еще работает. Я подозреваю, что это, вероятно, безопасно, и эта гарантия, вероятно, будет добавлена когда-нибудь, но ее сейчас нет. Однако эквивалентный API Grand Central Dispatch API гарантирует, что вы сможете безопасно выпускать свои очереди, когда вы закончите использовать их, и он будет поддерживать их до тех пор, пока они им понадобятся. Поэтому, если вы на платформе с GCD, вы можете использовать это, чтобы быть уверенным, что оно не взорвется тем временем.
В качестве альтернативы вы можете создать класс-оболочку, который проверяет, завершена ли очередь, и освобождает очередь и сам, когда очередь завершена.