【发布时间】:2011-01-30 20:26:06
【问题描述】:
我有一个需要相当长的时间的任务,应该在后台运行。根据文档,这可以使用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?
【问题讨论】:
-
不确定答案,但是
[NSOperationQueue new]返回一个自动释放的对象,所以[[NSOperationQueue new] autorelease]会让你在同一个队列上释放两次,并且应该让你崩溃。此外,永远永远做[[Class alloc] init...]嵌套。永远不要分开alloc和init。你会省去一些麻烦。 -
[NSObject new] 等价于 [[NSObject alloc] init],所以不会自动释放...
-
不是您正在寻找的答案,但由于您只希望它用于一项任务,因此
[self performSelectorInBackground:@selector(doTask:) withObject:nil]是一个选项。还是必须是 NSOperation? -
@Brandon_Bodnar:听起来不错,但由于某种原因,它让我的应用程序窒息。
-
不自动释放队列怎么样,而是在队列末尾添加另一个任务,从而释放它?
标签: objective-c cocoa concurrency autorelease