引爆自动释放的NSOperationQueue是危险的吗?

时间:2010-03-23 15:03:15

标签: objective-c cocoa concurrency autorelease

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

答案 0 :(得分:5)

文档中没有任何内容可以说明当NSOperationQueue发布时会发生什么。假设无法保证任务将被执行是最安全的。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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