Опасно ли запускать 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?

Ответ 1

В документации нет ничего, чтобы сказать, что произойдет, когда NSOperationQueue будет выпущен. Было бы безопаснее предположить, что нет гарантии, что программа будет выполнена.

Ответ 2

Я бы догадался, что NSOperationQueue выпускает свои задачи при его выпуске, но я заметил, что задачи завершатся и делятся, даже если я освобожу очередь сразу после добавления задачи. Тем не менее, я не думаю, что полагаюсь на это поведение - там еще чего-то выиграть, сохранив NSOperationQueue в переменной экземпляра (и выпуская его в dealloc). Переменная экземпляра даст вам способ вызвать другие методы в очереди (cancelAllOperations, setSuspended и т.д.).

Ответ 3

Не можете ли вы использовать объект [NSOperation mainQueue], чтобы вам не нужно было беспокоиться о его автореализации? Если вам нужно только добавить одну задачу, которая, кажется, имеет для меня наибольшее значение.

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004592-RH2-SW21

Ответ 4

Там нет гарантии, что безопасно освободить NSOperationQueue, пока он все еще работает. Я подозреваю, что это, вероятно, безопасно, и эта гарантия, вероятно, будет добавлена ​​когда-нибудь, но ее сейчас нет. Однако эквивалентный API Grand Central Dispatch API гарантирует, что вы сможете безопасно выпускать свои очереди, когда вы закончите использовать их, и он будет поддерживать их до тех пор, пока они им понадобятся. Поэтому, если вы на платформе с GCD, вы можете использовать это, чтобы быть уверенным, что оно не взорвется тем временем.

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