Действительно ли опасно выделить автовыпущенный NSOperationQueue?

У меня есть задача, которая скорее занимает много времени и должна работать в фоновом режиме. Согласно документации, это может быть сделано с помощью NSOperationQueue. Однако я не хочу сохранять глобальную классом копию NSOperationQueue так как я действительно только использую его для той одной задачи. Следовательно, я просто установил его, чтобы автовыпустить и надеяться, что это не будет выпущено, прежде чем задача сделана.Работает.
как это:

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 с ним?

11
задан bastibe 23 March 2010 в 15:03
поделиться

4 ответа

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

5
ответ дан 3 December 2019 в 10:44
поделиться

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

1
ответ дан 3 December 2019 в 10:44
поделиться

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

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

1
ответ дан 3 December 2019 в 10:44
поделиться

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

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

1
ответ дан 3 December 2019 в 10:44
поделиться