首先,您不应该只是创建然后释放队列。将该队列创建为类的 ivars 之一,然后在您的视图控制器消失时释放它(您也可以取消任何挂起的操作并取消/等待任何正在运行的操作完成)更为自然。
其次,您不需要创建操作并将其添加到队列中的方法中的自动释放池,因为该方法是从主线程调用的。相反,您需要对象实际调用的方法中的自动释放池(这可能在另一个线程上运行)。
因此,您可能有以下内容(假设您将队列命名为 ivar queue_):
- (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 中进行初始化,而是检查它的存在并在必要时在您要添加操作的任何地方进行初始化。这可能包含在它自己的方法调用中,但是这里的延迟初始化可能并不是真正必要的,因为队列非常轻量级。