I have a task that takes a rather long time and should run in the background. According to the documentation, this can be done using an NSOperationQueue
. However, I do not want to keep a class-global copy of the NSOperationQueue
since I really only use it for that one task. Hence, I just set it to autorelease and hope that it won't get released before the task is done. It works.
like this:
NSInvocationOperation *theTask = [NSInvocationOperation alloc];
theTask = [theTask initWithTarget:self
selector:@selector(doTask:)
object:nil];
NSOperationQueue *operationQueue = [[NSOperationQueue new] autorelease];
[operationQueue addOperation:theTask];
[theTask release];
I am kind of worried, though. Is this guaranteed to work? Or might operationQueue
get deallocated at some point and take theTask
with it?
[NSOperationQueue new]
returns an autoreleased object, so[[NSOperationQueue new] autorelease]
will make you release twice on the same queue, and should make you crash. Also, always and ever do[[Class alloc] init...]
nested. Don't separatealloc
andinit
ever. You'll save yourself some headaches. – Kings[self performSelectorInBackground:@selector(doTask:) withObject:nil]
an option. Or must it be an NSOperation? – Homage