Re: NSInvocationOperations mysteriously whacked out of NSOperationQueue
Re: NSInvocationOperations mysteriously whacked out of NSOperationQueue
- Subject: Re: NSInvocationOperations mysteriously whacked out of NSOperationQueue
- From: Ken Thomases <email@hidden>
- Date: Thu, 25 Aug 2011 01:30:39 -0500
On Aug 25, 2011, at 12:15 AM, Jerry Krinock wrote:
> I discovered a bug in my app today caused by the following repeatable behavior: When one particular NSInvocationOperation in an NSOperationQueue executes, two others get whacked out of the queue, and thus never execute.
> All but three of the operations are instances of my own subclass of NSOperation. Indexed starting with 1, these operations, numbers 17, 32 and 40, are NSInvocationOperations. Although all three of the subject invocations invoke the same target (which happens to be the operation queue) and the same selector, the three invocations are different objects, and the three invocation operations are different objects.
> Fortunately, NSInvocationOperation is only a convenience, and by simply replacing these operations with instances of my own NSOperation subclass, the problem was fixed.
>
> Can anyone take a stab at explaining this?
At a guess, the NSOperationQueue may be dequeuing operations using something like -[NSMutableArray removeObject:] instead of -[NSMutableArray removeObjectIdenticalTo:]. Thus, it is depending on -isEqual:. I further guess that NSInvocationOperation objects with identical targets and selectors compare equal.
Definitely sounds like a bug.
You could test by a) subclassing NSInvocationOperation to change its equality semantic and seeing if the problem goes away, and b) seeing if you can reproduce with a custom NSOperation subclass which implements equality based on value and not identity.
Regards,
Ken
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden