我的任务需要相当长的时间才能在后台运行。根据文档,这可以使用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
吗?
答案 0 :(得分:5)
文档中没有任何内容可以说明当NSOperationQueue发布时会发生什么。假设无法保证任务将被执行是最安全的。
答案 1 :(得分:1)
我猜想NSOperationQueue会在它发布时释放它的任务,但我注意到即使我在添加任务后立即释放队列,任务也会完成并释放。也就是说,我认为我不依赖于这种行为 - 通过将NSOperationQueue存储在实例变量中(并在dealloc中释放它)可以获得更多收益。实例变量将为您提供一种方法来调用队列上的其他方法(cancelAllOperations,setSuspended等)。
答案 2 :(得分:1)
你不能使用[NSOperation mainQueue]
对象,这样你就不用担心自动释放吗?如果你只需要添加一个似乎对我来说最有意义的任务。
答案 3 :(得分:1)
无法保证在NSOperationQueue仍在工作时释放它是安全的。我怀疑它可能是安全的,并且这个保证可能有一天会被添加,但它现在不存在。但是,等效的Grand Central Dispatch API 确保保证您在完成使用后可以安全地释放其队列,并且只要需要它们就可以保留它们。因此,如果您使用的是GCD平台,您可以使用它来确保它不会在此期间爆炸。
或者,您可以创建一个包装类来检查队列是否已完成,并在队列完成时释放队列及其自身。