Опасно ли запускать автоматически выпущенную NSOperationQueue? - PullRequest
11 голосов
/ 23 марта 2010

У меня есть задача, которая занимает довольно много времени и должна выполняться в фоновом режиме. Согласно документации, это можно сделать с помощью 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 с этим?

Ответы [ 4 ]

5 голосов
/ 23 марта 2010

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

1 голос
/ 23 марта 2010

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

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

1 голос
/ 23 марта 2010

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

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

1 голос
/ 23 марта 2010

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

...