Во-первых, вы не должны просто создавать, а затем освобождать очередь.Более естественно создать эту очередь в качестве одного из иваров вашего класса, а затем освободить ее, когда ваш контроллер представления исчезнет (вы также можете отменить любые ожидающие операции и отменить / дождаться завершения любых выполняющихся операций).
Во-вторых, вам не нужен пул автоматического выпуска в методе, который создает операцию и добавляет ее в очередь, поскольку этот метод вызывается из основного потока.Вместо этого вам нужен пул автоматического выпуска из метода, который фактически вызывает ваш объект (это то, что может выполняться в другом потоке).
Итак, у вас может быть следующее (при условии, что вы назовете свою очередь ива-очередь _):1005 *
- (void)viewDidLoad
{
[super viewDidLoad];
if( !queue_ ) queue_ = [[NSOperationQueue alloc] init];
// other view loading code
}
- (void)loadData
{
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(firstRun) object:nil];
[queue_ addOperation:operation];
[operation release];
}
- (void)firstRun
{
// Here we may run on another thread, so 1) we need an autorelease pool; and
// 2) we need to make sure we don't do anything that requires a runloop
NSAutoreleasePool* threadPool = [NSAutoreleasePool new];
// do long-running things
[threadPool drain];
}
- (void)dealloc
{
if( queue_ ) {
[queue_ setSuspended:YES];
[queue_ cancelAllOperations];
// you need to decide if you need to handle running operations
// reasonably, but don't wait here because that may block the
// main thread
[queue_ release];
}
// other dealloc stuff
[super dealloc];
}
Вы также можете инициализировать свою очередь по требованию, поэтому вместо инициализации в viewDidLoad проверьте ее наличие и при необходимости инициализируйте везде, где бы вы ни добавили операцию.Это может быть включено в собственный вызов метода, но ленивая инициализация здесь, вероятно, на самом деле не нужна, поскольку очереди довольно легкие.