11

我有一个需要相当长时间的任务,应该在后台运行。根据文档,这可以使用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

4 回答 4

5

文档中没有说明释放 NSOperationQueue 时会发生什么。假设不能保证任务会被执行是最安全的。

于 2010-03-23T18:45:47.620 回答
1

我会猜到 NSOperationQueue 在发布时会释放其任务,但我注意到即使我在添加任务后立即释放队列,任务也会完成并解除分配。也就是说,我不认为我会依赖这种行为 - 通过将 NSOperationQueue 存储在实例变量中(并在 dealloc 中释放它)可以获得更多收益。实例变量将为您提供一种调用队列中其他方法的方法(cancelAllOperations、setSuspended 等)。

于 2010-03-23T18:17:54.727 回答
1

你不能使用这个[NSOperation mainQueue]对象,这样你就不必担心自动释放它了吗?如果您只需要添加一项对我来说似乎最有意义的任务。

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

于 2010-03-23T18:44:50.323 回答
1

不能保证在 NSOperationQueue 仍在工作时释放它是安全的。我怀疑它可能是安全的,并且可能有一天会添加此保证,但现在不存在。但是,等效的 Grand Central Dispatch API确实保证您可以在使用完队列后安全地释放它们,并且只要需要它们就会保留它们。因此,如果您在一个带有 GCD 的平台上,您可以使用它来确保它在此期间不会爆炸。

或者,您可以创建一个包装类来检查队列是否完成,并在队列完成时释放队列和自身。

于 2010-03-23T18:45:42.347 回答